使用简单的CRITICAL_SECTION似乎处于死锁状态
using a simple CRITICAL_SECTION, seem to be deadlocked
我有一个简单的C程序,它使用CRITICAL_SECTION。由于某种原因,它似乎一次又一次地进入CRITICAL_SECTION,而没有真正执行里面的代码,导致线程死锁。我似乎找不出原因。
这是代码:
#include <windows.h>
#include <iostream>
#define N 100000000
CRITICAL_SECTION cs;
static DWORD WINAPI safe_increment(void *param)
{
volatile long* x = (volatile long*)param;
for(int i=0;i<N;++i)
EnterCriticalSection(&cs);
++(*x);
LeaveCriticalSection(&cs);
return 0;
}
void main()
{
InitializeCriticalSection(&cs);
volatile long x = 0;
HANDLE h[2];
DWORD thread_id;
int x = 0;
h[0] = CreateThread(NULL,0,safe_increment,(void*)&x,0,&thread_id);
h[1] = CreateThread(NULL,0,safe_increment,(void*)&x,0,&thread_id);
WaitForMultipleObjects(2,h,TRUE,INFINITE);
CloseHandle(h[0]);
CloseHandle(h[1]);
DeleteCriticalSection(&cs);
std::cout << "Result of safe increment: " << x << "n";
}
谢谢!
罗伊。
for
循环中的错误。应为:
for(int i=0;i<N;++i)
{ // <---
EnterCriticalSection(&cs);
++(*x);
LeaveCriticalSection(&cs);
} // <---
没有大括号,所以for
循环只执行EnterCriticalSection()
,而不执行其他内容。获得关键部分的第一个线程从未释放它:死锁。
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 使用 std::async 时死锁,将来作为成员
- c++ 为什么我不应该从不同的线程解锁互斥锁
- 当互斥锁解锁时,它会notify_all或notify_one
- 在C++中使用原子TestAndSet混合无锁和锁全线程同步
- 异常时解锁互斥锁
- pthread_cond_wait不会解锁互斥锁
- 什么'如果pthread_cond_wait自己这样做,那么锁定和解锁互斥锁的意义就在于什么
- 含义std::互斥锁解锁与锁同步以重新获取
- 如何等待直到互斥锁解锁
- c++ Boost线程.如何使用递归尝试锁?死锁发生在并发代码中
- 类似于嵌套互斥锁,但更通用
- 有必要在main函数结束时解锁互斥锁吗?
- 当互斥锁/解锁深埋在函数调用中时,我需要栅栏或屏障或其他东西吗?
- 如何在 if-else 阶梯中针对特定条件放置互斥锁和解锁?
- 访问类数据时互斥锁/解锁的替代方案
- 取消一个锁了互斥锁的线程不会解锁互斥锁
- 互斥锁解锁异常失败