关于互斥锁和信号量

时间:2015-10-24 22:04:50

标签: multithreading

假设有4个线程(T1到T4)需要同时运行,3个结构(Struct1到Struct3)作为资源

T1到T2共享struct1(通过T1写入struct1,T2读取它)

T2到T3共享struct2(通过T2写入struct2并从中读取T3)

T3到T4共享struct3(通过T3写入struct3并从中读取T4)

由于Bjarne Stroustrup的C ++编程语言(第4版)§41.2.4中的这一陈述:

  

“如果两个线程都可以访问内存位置,则两个线程都会进行数据竞争   同时并且它们的至少一个访问是写入。注意   精确定义“同时”并非易事。如果两个   线程有数据竞争,没有语言保证保持:行为是   未定义“。

很明显需要同步化。

1 - 这些原语中的哪一个适用于此应用程序,只有mutices或Semaphores?

2-如果选择互斥,我们需要3个突变,每个结构一个互斥,对吧?

3-在给定的非原子操作中使用互斥锁的事实会阻塞其他线程的CPU时间吗?

2 个答案:

答案 0 :(得分:0)

您的用例有点抽象,因此可以使用更好的解决方案。但仅基于您提供的信息:

1)使用互斥锁。我不知道信号量如何帮助除了用作互斥量。当您共享更多资源时,信号量可能很有用,但在您的情况下,它一次只能使用一个信号量。

如果所有四个线程都访问第一个免费结构,或者你的结构是一个队列,那么信号量可能会有所帮助。

2)对,每个结构一个互斥锁。

3)是的,可能,这是想法,当T2正在读取struct1时,你不希望T1写入,反之亦然。最坏的情况可能是已经阻止阻止T4的T3的T1区块T2。

答案 1 :(得分:0)

每个队列的1 - 3个信号量,请参阅Producer–consumer problem

2- 1的信号量可能是互斥量,二进制信号量就像互斥量。

3-如果你必须等待信号量或互斥量,你将被置于操作系统的无就绪队列中,等待释放。因此不使用任何CPU(除了上下文切换所花费的1000个周期)。

相关问题