C++-用关键段实现线程同步

发布于 2017-02-14 02:19:26 字数 1624 浏览 1221 评论 3

下面是一段用关键段实现线程同步的例子:

//关键段测试代码

#include <iostream>
#include <windows.h>

using namespace std;

CRITICAL_SECTION g_cs;//创建CRITICAL_SECTION结构全局变量

int g_x = 50;

//线程函数1
DWORD WINAPI ThreadFunc1(LPVOID lpParam)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
cout << "Thread1 get the access to resource" << endl;
if(g_x > 25)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<g_x--<<endl;
}
else
break;

LeaveCriticalSection(&g_cs);
}

return 0;
}

//线程函数2
DWORD WINAPI ThreadFunc2(LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
cout << "Thread2 get the access to resource" << endl;
if(g_x > 0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<g_x--<<endl;
}
else
break;
LeaveCriticalSection(&g_cs);
}

return 0;
}

int main()
{
HANDLE hThread1;
HANDLE hThread2;
InitializeCriticalSection(&g_cs);
hThread1=CreateThread(NULL,0,ThreadFunc1,NULL,0,NULL);
hThread2=CreateThread(NULL,0,ThreadFunc2,NULL,0,NULL);

CloseHandle(hThread1);
CloseHandle(hThread2);

Sleep(4000);
DeleteCriticalSection(&g_cs);

return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泛泛之交 2017-10-02 20:17:31

线程1 break后没有LeaveCriticalSection,导致了问题。
两个线程中都添加类似下面的处理

//线程函数1
DWORD WINAPI ThreadFunc1(LPVOID lpParam)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
cout << "Thread1 get the access to resource" << endl;
if(g_x > 25)
{
Sleep(10);
cout<<"thread1 sell ticket : "<<g_x--<<endl;
}
else
{
LeaveCriticalSection(&g_cs);//add
break;
}

LeaveCriticalSection(&g_cs);
}
cout << "Thread1 exit" << endl;
return 0;
}

想挽留 2017-09-21 17:26:59

哥哥:试着修改成这个哈,首先一点: sleep() 是要释放资源的,不然在你睡眠过程中你还是将资源锁住的哈。

cout<<"thread2 sell ticket : "<<g_x--<<endl;
LeaveCriticalSection(&g_cs);
Sleep(1);

偏爱自由 2017-07-13 01:34:12

你的代码存在几个细节问题:
1.睡眠的时候占用了资源,应该在睡眠前释放资源
2.else判断后跳出循环存在资源未释放的危险,造成死锁
3.CloseHandle(hThread1) 函数并没有关闭线程,DeleteCriticalSection(&g_cs)此时释放资源可能会造成正在运行的线程出现资源访问错误(主进程调用sleep进行睡眠是你程序没出错的原因,但这样并不可靠)。

下面是我修改过后的代码,你可以试试:

 #include <iostream>
#include <windows.h>

using namespace std;

CRITICAL_SECTION g_cs;//创建CRITICAL_SECTION结构全局变量

int g_x = 50;

//线程函数1
DWORD WINAPI ThreadFunc1(LPVOID lpParam)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
cout << "Thread1 get the access to resource" << endl;
if(g_x > 25)
{
cout<<"thread1 sell ticket : "<<g_x--<<endl;
}
else
break;

LeaveCriticalSection(&g_cs);
Sleep(1);
}

LeaveCriticalSection(&g_cs);
return 0;
}

//线程函数2
DWORD WINAPI ThreadFunc2(LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
cout << "Thread2 get the access to resource" << endl;
if(g_x > 0)
{
cout<<"thread2 sell ticket : "<<g_x--<<endl;
}
else
break;

LeaveCriticalSection(&g_cs);
Sleep(1);
}

LeaveCriticalSection(&g_cs);
return 0;
}

int main()
{
HANDLE hThread1;
HANDLE hThread2;
InitializeCriticalSection(&g_cs);
hThread1=CreateThread(NULL,0,ThreadFunc1,NULL,0,NULL);
hThread2=CreateThread(NULL,0,ThreadFunc2,NULL,0,NULL);

WaitForSingleObject(hThread1,INFINITE);
WaitForSingleObject(hThread2,INFINITE);

CloseHandle(hThread1);
CloseHandle(hThread2);

DeleteCriticalSection(&g_cs);

cout<<"Press Enter to end"<<endl;
getchar();

return 0;
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文