相关疑难解决方法(0)

在什么情况下你在C++中使用信号量而不是互斥量?

在我读过的关于多线程的资源中,与信号量相比,更经常使用和讨论互斥.我的问题是你什么时候使用信号量而不是互斥量?我没有在Boost线程中看到信号量.这是否意味着信号量这些天不再使用太多?

据我所知,信号量允许多个线程共享资源.只有当这些线程只读取资源但不写入时,才可能这样做.它是否正确?

c++ multithreading semaphore

36
推荐指数
4
解决办法
3万
查看次数

ReleaseSemaphore 不释放信号量

(简而言之:main() 的 WaitForSingleObject 挂在下面的程序中)。

我正在尝试编写一段代码来调度线程并在它恢复之前等待它们完成。我不是每次都创建线程,这是昂贵的,而是让它们进入睡眠状态。主线程在 CREATE_SUSPENDED 状态下创建 X 个线程。

同步是使用 X 作为 MaximumCount 的信号量完成的。信号量的计数器归零,线程被分派。线程执行一些愚蠢的循环并在它们进入睡眠之前调用 ReleaseSemaphore。然后主线程使用 WaitForSingleObject X 次以确保每个线程完成其工作并处于睡眠状态。然后它循环并再次执行所有操作。

有时程序不退出。当我启动程序时,我可以看到 WaitForSingleObject 挂起。这意味着线程的 ReleaseSemaphore 不起作用。没有什么是 printf'ed 所以据说没有出错。

也许两个线程不应该在完全相同的时间调用 ReleaseSemaphore ,但这会使信号量的目的无效......

我只是不理解它...

感谢同步线程的其他解决方案!

#define TRY  100
#define LOOP 100

HANDLE *ids;
HANDLE semaphore;

DWORD WINAPI Count(__in LPVOID lpParameter)
{ 
 float x = 1.0f;   
 while(1)
 { 
  for (int i=1 ; i<LOOP ; i++)
   x = sqrt((float)i*x);
  while (ReleaseSemaphore(semaphore,1,NULL) == FALSE)
   printf(" ReleaseSemaphore error : %d ", GetLastError());
  SuspendThread(ids[(int) lpParameter]);
 }
 return (DWORD)(int)x;
}

int …
Run Code Online (Sandbox Code Playgroud)

c++ windows multithreading synchronization semaphore

2
推荐指数
1
解决办法
1万
查看次数

信号量实施

我想知道是否有办法在C++(或C#)中实现信号量,任何有帮助的库.我尝试使用OpenMP但我无法实际阻止线程,而是我不得不忙着等待它们,如果/当我没有足够数量的线程时会导致死锁.首先,我正在寻找一个可以让我阻止/生成/杀死我的线程的库.
其次,有没有已经实现信号量的库?
最后,当我被介绍到信号量的上下文时,我发现它非常有用(也许我错了?)但我没有看到很多库(如果有的话)实现它.我熟悉OpenMP,环顾英特尔的TBB,C#线程.但是在这些中我都没有明确地看到信号量.那些信号量不像我想的那么实用吗?还是他们难以实施?还是我不知道?
PS
信号量可以跨平台实现吗?因为它们可能与操作系统有关.

c# c++ implementation semaphore

2
推荐指数
1
解决办法
3629
查看次数