Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C强制线程在pthread_创建后立即启动。pthread_创建后的pthread_产量?_C_Multithreading_Pthreads - Fatal编程技术网

C强制线程在pthread_创建后立即启动。pthread_创建后的pthread_产量?

C强制线程在pthread_创建后立即启动。pthread_创建后的pthread_产量?,c,multithreading,pthreads,C,Multithreading,Pthreads,我正在努力实现以下目标: 强制新创建的线程在pthread\u create()之后立即开始运行。没有使用实时调度 从: 除非是实时调度策略 正在使用,在调用pthread_create()后 不确定调用方或新线程下一个将使用哪个线程 执行 这当然有道理。因此,我认为通过使用pthread\u yield()我将强制新创建的线程接管并作为启动的结果。但事实并非如此 我只能在pthread\u create()之后睡觉,才能达到预期的效果。但我不想依赖这个atm解决方案 为什么我不能用pthrea

我正在努力实现以下目标:

强制新创建的线程在
pthread\u create()
之后立即开始运行。没有使用实时调度

从:

除非是实时调度策略 正在使用,在调用pthread_create()后 不确定调用方或新线程下一个将使用哪个线程 执行

这当然有道理。因此,我认为通过使用
pthread\u yield()
我将强制新创建的线程接管并作为启动的结果。但事实并非如此

我只能在
pthread\u create()
之后睡觉,才能达到预期的效果。但我不想依赖这个atm解决方案

  • 为什么我不能用
    pthread\u yield()
    实现我的目标
  • 除了睡觉还有别的方法吗
  • 新线程的创建与任务切换的处理方式相同,即遵循调度策略?例如,在RT(抢占式)调度中,如果新创建的线程具有更高的优先级,它会立即抢占当前线程吗
  • 相关职位:


    谢谢

    如果您在多核系统上,那么您的新线程可能调度在与创建它的线程不同的核心上。调用
    pthread\u yield()
    可能没有预期的效果,因为它可能只影响调用者核心上的调度,而不影响任何其他核心上的调度。其效果通常是将线程放在可运行队列的末尾。(同样值得注意的是,
    pthread_yield()
    不是标准的系统调用,因此没有关于其预期行为的标准参考。)

    如果睡眠时间不为零,则调用
    sleep()
    可能会产生不同的结果。该线程实际上被放置在计时器唤醒队列中,并且必须在计时器过期后移回可运行队列。这将使得在创建线程唤醒之前,更可能在另一个核心上运行一个新线程

    如果新线程的优先级高于创建它的线程,它将抢占创建线程


    正如注释中所建议的,通过使创建线程有条件地等待来自新创建线程的信号,可以实现可预测的行为。

    如果您在多核系统上,则新线程可能调度在与创建它的线程不同的核上。调用
    pthread\u yield()
    可能没有预期的效果,因为它可能只影响调用者核心上的调度,而不影响任何其他核心上的调度。其效果通常是将线程放在可运行队列的末尾。(同样值得注意的是,
    pthread_yield()
    不是标准的系统调用,因此没有关于其预期行为的标准参考。)

    如果睡眠时间不为零,则调用
    sleep()
    可能会产生不同的结果。该线程实际上被放置在计时器唤醒队列中,并且必须在计时器过期后移回可运行队列。这将使得在创建线程唤醒之前,更可能在另一个核心上运行一个新线程

    如果新线程的优先级高于创建它的线程,它将抢占创建线程


    按照注释中的建议,通过使创建线程有条件地等待来自新创建线程的信号,可以实现可预测的行为。

    pthread_create()之后使用条件和块
    直到新线程向创建者线程发出信号。^^应该是一个答案-这是一个明显而正确的解决方案:)代码中的哪个线程正在调用pthread_yield()?pthread_yield()通知操作系统您的线程已完成工作,并且可以将执行切换到另一个线程。@iharab是的,这可能是另一个解决方案。谢谢!但我也试图理解为什么
    pthread\u yield()
    方法对我不起作用@特伦斯调用
    pthread\u create()
    的线程也在调用
    pthread\u yield()
    。您可以尝试设置关联性并在特定的内核上运行进程,以查看pthread\u yield()是否有效,例如,请参见此处在
    pthread\u create()之后使用条件和块
    直到新线程向创建者线程发出信号。^^应该是一个答案-这是一个明显而正确的解决方案:)代码中的哪个线程正在调用pthread_yield()?pthread_yield()通知操作系统您的线程已完成工作,并且可以将执行切换到另一个线程。@iharab是的,这可能是另一个解决方案。谢谢!但我也试图理解为什么
    pthread\u yield()
    方法对我不起作用@特伦斯调用
    pthread\u create()
    的线程也在调用
    pthread\u yield()
    。您可以尝试设置关联并在特定的内核上运行进程,以查看pthread\u yield()是否有效,请参见此处的示例