2012-02-23 39 views
0

我想实现一个互斥锁。 从我的理解,mutex.lock()应该像 1)检查锁的所有者 2)如果锁被拥有,把线程等待队列 3)暂停本线程,直到另一个线程发送最多等待信号暂停pthread?

然而,没有什么像pthread_suspend()那么我该如何挂起? 我发现有人说使用pthread_con_wait(),但似乎如果我想使用该功能,我必须首先设置一个pthread_mutex锁,这是没有意义的,我的互斥体内使用pthread_mutex。

那么,如果我对互斥的理解是错误的,请纠正我。

谢谢。

回答

0

mutex.lock()应该工作一样:

1)检查锁的所有者 2)如果锁被拥有,把线程等待队列 3)暂停本线程,直到拥有锁的线程发送唤醒信号。没有其他线程可以释放锁。

这些步骤应该原子操作,以便正确的行为是遵循所有线程获取/释放互斥体,无论这样的电话怎么可能会被中断,并从其他线程重新输入进行。

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

如果你想要一个互斥锁,使用OS互斥锁 - 这就是任何跨平台的库。会做。

+0

那么spin-wait check(线程插入到Q后)是什么?喜欢这个? “while(lockOwner!= self)”那么这和自旋锁之间有什么区别...... – user956159 2012-02-25 16:50:40

0

你只能做出与最简单的部分一样复杂的东西。如果你有最简单的部分互斥体,那么你不能从你拥有的部分制作互斥体。你只能使得事物至少像互斥体一样复杂或更多。如果你的任何部分比互斥体简单,请告诉我们它们是什么,我们可以告诉你如何从它们中创建互斥锁。

我想,如果你愿意,你可以使自己的互斥出并行线程互斥体和条件变量。我不确定这一点是什么,但这是微不足道的。如您所述,您可以使用pthread_cond_wait来等待您自己的互斥量。

原因并行线程标准为您提供了一个互斥体,因为它是关于最灵活的可能同步原语。

2

互斥锁,锁和等待条件都是不同的,独特的东西。你需要一个互斥变量,以便实现锁定和等待条件。

锁是一种简单的机制,以防止多于一个的线程从通过使所有由一个线程等待锁被解锁一次执行相同的代码。

甲等待条件是一个稍微较复杂的结构,其允许一个线程来监视的条件(通常是一个布尔标志),并且仅唤醒当标志已经有利地改变。

在两种情况下,当一个线程块(即休眠)时,操作系统的调度原语自动照顾descheduling线程,并使用可用的计算时间的别处。线程和任务调度不是您通常不必担心的手动操作。