1
8
只要在Windows中编程,就不要重新实现互斥体的行为。同一线程的可重入性对于其定义的行为是绝对必要的。 没有线程关联的同步对象是一个计数为1的信号量。使用CreateSemaphore()。 我很好奇你需要这种行为。听起来您试图在多个地方不适当地使用同一个同步对象。您可以使用信号量,但是您将失去并发性的潜力。考虑使用多个互斥体。 |
2
7
不能更改Windows互斥锁是递归的事实。虽然POSIX线程在默认情况下不是递归的,但是
可以
使用
在Windows中锁定互斥锁实际上是一项非常昂贵的操作,并且最适合进程间同步。对于仅在单个进程中使用的互斥体,通常使用关键部分,但这些部分也是可重入的。正如nobugz所说,您需要使用一个信号量,用最大计数1初始化,以获得非递归同步。 信号量对象就像一个特殊的计数器,可以跨线程(或进程,如果创建为共享的话)原子地递增和递减。通过创建一个最大计数为1的函数,可以得到所需的非递归行为。 |
3
2
我建议使用 Read/Write locks (aka SRW) . 与Windows互斥体一样,它们不是递归的。和关键部分一样,它们很轻,如果它们是自由的,就不会调用内核。( Benchmarks ) |
4
0
|
da cheng · 在c++11中使用条件变量使程序陷入死锁 6 年前 |
Eunjeong Choi · 为什么此代码返回意外结果?(条件变量) 6 年前 |
Razonixx · 从线程内增加全局计数器变量,而不必等待每个线程 6 年前 |
Administrator · c#-等待完成2个线程中的1个 6 年前 |
Francis Cugler · 删除Windows库依赖项 7 年前 |
AshR · 程序断断续续地使用main报告与线程本身不同的线程id 7 年前 |
user7256215 · 在macOS内核扩展中有效地使用同步 7 年前 |