是不是C++ 0x没有信号量?Stack Overflow上已经有一些关于信号量使用的问题.我一直使用它们(posix信号量)让线程等待另一个线程中的某个事件:
void thread0(...)
{
doSomething0();
event1.wait();
...
}
void thread1(...)
{
doSomething1();
event1.post();
...
}
Run Code Online (Sandbox Code Playgroud)
如果我用互斥量做到这一点:
void thread0(...)
{
doSomething0();
event1.lock(); event1.unlock();
...
}
void thread1(...)
{
event1.lock();
doSomethingth1();
event1.unlock();
...
}
Run Code Online (Sandbox Code Playgroud)
问题:它很难看并且不能保证thread1首先锁定互斥锁(假设同一个线程应该锁定和解锁互斥锁,你也无法在thread0和thread1启动之前锁定event1).
因此,由于boost也没有信号量,实现上述目标的最简单方法是什么?
阅读关于两者之间差异的各种帖子(互斥和信号量)我得出以下结论如果我错了请纠正我.这主要与windows有关.我知道关键部分是代码中需要保护的部分(即)多个线程不能同时访问.现在,为了保护这些关键部分,使用了互斥锁.这些互斥锁可以是算法或数据结构.现在,互斥体通常可以有两种形式(进程内和进程间).对于其中的内核没有呼吁锁定由我们可以使用内部流程加速线程同步原语,例如lock_guard,unique_lock,shared_lock(单作家/多读者)和进程间,我们可以使用 升压进程间的信号.现在这些进程间互斥基本上称为信号量.我之所以得出结论是因为这篇文章说明了这一点
信号量是信号机制("我做完了,你可以继续"的信号).例如,如果您正在移动设备上监听歌曲(假设它是一项任务),同时您的朋友打电话给您,则会触发中断,中断服务程序(ISR)将通知呼叫处理任务唤醒.
现在提升进程间状态
Boost.Interprocess实现了类似的机制来同步来自不同进程的线程.
如果我对信号量的理解方向正确,请告诉我.
现在,我不理解的信号量的另一个定义来自这里 选定的答案状态
信号量与互斥锁相同但允许x个线程进入.
哪个正确描述了信号量的作用?它是否允许进程间资源保护,还是允许特定数量的线程访问资源?如果确实如此,那么第二个不会破坏资源,因为多个线程正在访问它.
我想创建一个队列来存储我的任务,我希望它是一个缓冲区队列,我想使用信号量来保持线程安全,因为我使用多个线程来执行从任务队列中弹出的任务。 .当队列的大小小于buffer_size(我定义的一个变量)时,add_task线程会将新任务推送到任务队列,当队列满时,任务线程会被阻塞,所以我需要一个信号量最大值等于 buffer_size。
我知道在 windows api 中有 CreateSemophore,我可以在其中设置信号量的最大值:
CreateSemaphore(
NULL, // default security attributes
MAX_SEM_COUNT, // initial count
MAX_SEM_COUNT, // maximum count
NULL); // unnamed semaphore
Run Code Online (Sandbox Code Playgroud)
但是在linux中,我只能得到sem_init函数:
int sem_init (sem_t *sem, int pshared, unsigned int value)
Run Code Online (Sandbox Code Playgroud)
我只能设置初始值,但据说最大值是int的范围..
所以我的问题是如何在 Linux 上的 C++ 中创建一个具有最大值的信号量?
我想知道是否有办法在C++(或C#)中实现信号量,任何有帮助的库.我尝试使用OpenMP但我无法实际阻止线程,而是我不得不忙着等待它们,如果/当我没有足够数量的线程时会导致死锁.首先,我正在寻找一个可以让我阻止/生成/杀死我的线程的库.
其次,有没有已经实现信号量的库?
最后,当我被介绍到信号量的上下文时,我发现它非常有用(也许我错了?)但我没有看到很多库(如果有的话)实现它.我熟悉OpenMP,环顾英特尔的TBB,C#线程.但是在这些中我都没有明确地看到信号量.那些信号量不像我想的那么实用吗?还是他们难以实施?还是我不知道?
PS
信号量可以跨平台实现吗?因为它们可能与操作系统有关.