pthread_create的介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pthread_create的介绍相关的知识,希望对你有一定的参考价值。

参考技术A

pthread_create是类Unix操作系统(Unix、Linux、Mac OS X等)的创建线程的函数。

C 强制线程在 pthread_create 之后立即启动。 pthread_create 之后的 pthread_yield?

【中文标题】C 强制线程在 pthread_create 之后立即启动。 pthread_create 之后的 pthread_yield?【英文标题】:C force the thread to start immediately after pthread_create. pthread_yield after pthread_create? 【发布时间】:2016-01-18 16:32:55 【问题描述】:

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

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

来自pthread_create() man page:

除非实时调度策略 正在使用,在调用 pthread_create() 之后,它是 不确定下一个线程(调用者还是新线程) 执行。

这当然是有道理的。因此,我想通过使用pthread_yield() 我将强制 新创建的线程接管并因此启动。但事实并非如此。

我只有在pthread_create() 之后睡觉才能达到预期的效果。但我不想依赖这个解决方案。

    为什么我无法通过pthread_yield() 实现我的目标? 除了使用睡眠还有其他方法吗? 新线程的创建与任务切换的处理方式相同,即遵循调度策略?比如在RT(抢占式)调度中,如果新创建的线程具有更高的优先级,是否会立即抢占当前线程?

相关帖子:

Does pthread_create starting thread? pthread_mutex not updating fast enough, so one thread "hogs" the lock.

谢谢!

【问题讨论】:

pthread_create()之后使用条件并阻塞,直到新线程向创建者线程发出信号。 ^^ 应该是一个答案 - 这是一个明显且正确的解决方案:) 代码中的哪个线程正在调用 pthread_yield()? pthread_yield() 通知操作系统您的线程已完成工作,并且可以将执行切换到另一个线程。 @iharab 是的,这可能是另一种解决方案。谢谢!但我也试图理解为什么pthread_yield() 方法对我不起作用。 @terence 正在调用 pthread_create() 的线程也在调用 pthread_yield() 您可以尝试设置亲和力并在特定内核上运行您的进程以查看 pthread_yield() 是否有效,例如参见此处xmodulo.com/run-program-process-specific-cpu-cores-linux.html 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于pthread_create的介绍的主要内容,如果未能解决你的问题,请参考以下文章

linux创建线程之pthread_create

绕道的 pthread_create 产生的线程不执行指令

调用库<semaphore.h>时,VS报错无法解析的外部符号 __imp__pthread_create

调用库<semaphore.h>时,VS报错无法解析的外部符号 __imp__pthread_create

静态成员函数与pthread_create,纯虚函数匹配使用实例

使用 pthread_create 时出现“分段错误(核心转储)”