0

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

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

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

谢谢。

4

3 回答 3

2

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

锁是一种简单的机制,它通过让所有线程等待锁解锁来防止多个线程同时执行相同的代码。

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

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

于 2012-02-23T23:10:05.407 回答
0

您只能制作至少与您拥有的最简单的部分一样复杂的东西。如果您拥有的最简单的部分互斥体,那么您不能从您拥有的部分中制作互斥体。您只能使事情至少与互斥锁一样复杂或更高。如果您有任何比互斥锁更简单的部分,请告诉我们它们是什么,我们可以告诉您如何用它们制作互斥锁。

我想,如果你愿意,你可以用 pthread 互斥锁和条件变量制作自己的互斥锁。我不确定重点是什么,但这很简单。正如您所指出的,您可以使用pthread_cond_wait等待您自己的互斥锁。

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

于 2012-02-23T23:06:10.523 回答
0

mutex.lock() 应该像这样工作:

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

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

'然而,没有像 pthread_suspend() 这样的东西,那我该如何做挂起呢?- 通常,你不会。操作系统内核提供了同步原语,可以阻止不应运行的线程。要在用户空间中实现“挂起”,您只能旋转等待——在少数情况下这是一个很好的策略,(负载不足的多核盒子,锁只保持很短的时间),但肯定不是全部,(并且可能导致整个机器集群发生灾难性的活锁)。

如果您想要一个互斥锁,请使用操作系统互斥锁 - 这就是任何跨平台库。会做。

于 2012-02-23T23:48:46.620 回答