信号量与互斥量
Semaphore Vs Mutex
本文关键字:信号量 更新时间:2023-10-16
我读了一些Mutex和信号量。
我有一段代码
int func()
{
i++;
return i;
}
i在外部某个地方被声明为全局变量。如果我创建计数为3的计数信号量,它不会有竞争条件吗?这是否意味着在这种情况下我应该使用二进制信号量或Mutex?
有人能给我一些实用的senarios,其中Mutex,关键部分和信号量可以使用。
可能我读了很多书。最后我有点困惑。有人能理清思路吗。
p.S:我已经理解了互斥和二进制信号量之间的主要区别是所有权。并且计数信号量应当被用作信令机制。
互斥和信号量之间的差异(我从未使用过CriticalSection):
- 使用条件变量时,其锁必须是互斥锁
- 当使用超过1个可用资源时,必须使用用可用资源数量初始化的信号量,因此当资源不足时,下一个线程会阻塞
- 当使用1个资源或一些只能由1个线程执行的代码时,您可以选择使用互斥或用1初始化的信号量(OP的问题就是这样)
- 当让一个线程等待另一个线程发出信号时,您需要一个以0初始化的信号量(等待线程执行sem.p(),发出信号的线程执行sem.v())
关键部分对象是最简单的方法。它是一个轻量级的同步对象。
以下是一些代码作为示例:
#define NUMBER_OF_THREADS 100
// global
CRITICAL_SECTION csMyCriticalSectionObject;
int i = 0;
HANDLE hThread[NUMBER_OF_THREADS];
int main(int argc, char *argv[])
{
// initialize the critical section object
InitializeCriticalSection(&csMyCriticalSectionObject);
// create 100 threads:
for (int n = 0; n < NUMBER_OF_THREADS; n++)
{
if (!CreateThread(NULL,0,func,hThread[n],0,NULL))
{
fprintf(stderr,"Failed to create threadn");
}
}
// wait for all 100 threads:
WaitForMultipleObjects(NUMBER_OF_THREADS,hThread,TRUE,INFINITE);
// this can be made more detailed/complex to find each thread ending with its
// exit code. See documentation for that
}
链接:CreateThread函数和WaitForMultipleObjects函数
带螺纹:
// i is global, no need for i to returned by the thread
DWORD WINAPI func( LPVOID lpvParam )
{
EnterCriticalSection(&csMyCriticalSectionObject);
i++;
LeaveCriticalSection(&csMyCriticalSectionObject);
return GetLastError();
}
Mutex和/或信号量在这方面做得很好。
编辑:信号量基本上是一个可以多次释放的互斥体。它存储释放操作的数量,因此可以释放相同数量的等待。
相关文章:
- 删除旧的信号量系统V
- 父进程和子进程之间的 POSIX 信号量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 单车道桥 使用信号量进行同步
- 用于 64 位/32 位 IPC 的 POSIX 信号量的替代方案?
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 发布信号量返回错误 6(无效句柄)
- 在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 如何让一个线程继续,而另一个线程正在等待C++中的信号量
- 实现信号量
- 计算信号量还是互斥体?
- POSIX 信号量在高争用/负载下不起作用
- C++:提升:托管共享内存是否需要信号量锁
- 信号量的问题
- 如何使用Windows API直接将进程"assign"到信号量?
- 从主线程C++更新信号量
- 生产者 - 消费者生产商创建2个元素POSIX信号量