暂停pthread?

时间:2012-02-23 23:00:57

标签: c multithreading suspend

我想实现一个互斥锁。 根据我的理解,mutex.lock()应该像 1)检查锁拥有者 2)如果拥有锁,则将线程放入等待队列 3)暂停此线程,直到另一个线程发送等待信号

然而,没有像pthread_suspend()那样的东西,那么我该如何暂停? 我发现有人说使用pthread_con_wait(),但似乎我想使用该函数,我必须首先设置一个pthread_mutex锁,在我的互斥锁中使用pthread_mutex是没有意义的。

好吧,如果我对互斥锁的理解有误,请纠正我。

感谢。

3 个答案:

答案 0 :(得分:2)

互斥锁,锁和等待条件都是不同的,不同的东西。您需要一个互斥变量才能实现锁定和等待条件。

锁是一种简单的机制,它可以防止多个线程同时执行相同的代码,方法是让一个线程等待锁解锁。

等待条件是一个稍微复杂的结构,允许线程监视条件(通常是布尔标志),并且仅在标志有利变化时才唤醒。

在这两种情况下,当线程阻塞(即休眠)时,操作系统的调度原语自动负责解调线程并在其他地方使用可用的计算时间。线程和任务调度不是您通常需要手动担心的事情。

答案 1 :(得分:0)

你只能制作至少与最简单的作品一样复杂的东西。如果您拥有的最简单的部分是互斥锁,那么您就无法使用自己的部分制作互斥锁。你只能制作至少像互斥锁一样复杂的东西。如果你有任何比互斥锁更简单的部分,请告诉我们它们是什么,我们可以告诉你如何从它们中制作互斥锁。

我想,如果你愿意,可以使用pthread互斥锁和条件变量创建自己的互斥锁。我不确定这是什么意思,但这样做很简单。如您所述,您可以使用pthread_cond_wait等待您自己的互斥锁。

pthreads标准为您提供互斥锁的原因是因为它是最灵活的可能同步原语。

答案 2 :(得分:0)

mutex.lock()应该像:

1)检查锁拥有者 2)如果拥有锁,则将线程放入等待队列 3)暂停此线程,直到LOCK发出LOCK发送唤醒信号。没有其他线程可以释放锁定。

这些步骤应该作为原子操作执行,以便所有获取/释放互斥锁的线程都遵循正确的行为,无论这些调用如何被中断并从其他线程重新进入。

'然而,没有什么比pthread_suspend(),那我怎么做暂停?' - 通常,你没有。 OS内核提供了可以阻止不应该运行的线程的同步原语。要在用户空间中实现“暂停”,你只能旋转等待 - 在某些情况下这是一个很好的策略,(只在非常短的时间内保持锁定的欠载多核盒子),但当然不是全部,(并且可能导致整个机器群中出现严重灾难性的活锁)。

如果您需要互斥锁,请使用操作系统互斥锁 - 这就是任何跨平台的lib。会做的。