大家好,欢迎来到IT知识分享网。
在多线程的程序编写中,常常遇到共享资源使用冲突解决的苦恼。终于看到并测试了一种简单方法。
线程锁的5个要素:
CRITICAL_SECTION g_cs; //定义线程锁
InitializeCriticalSection(&g_cs); //初始化
DeleteCriticalSection(&g_cs); //删除
EnterCriticalSection(&g_cs); //加锁
LeaveCriticalSection(&g_cs); //释放锁
下面是测试程序locktest.cpp:
#include <iostream>
#include <windows.h>
using namespace std;
CRITICAL_SECTION g_cs;
DWORD WINAPI fThread1(LPVOID lpParameter)
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
EnterCriticalSection(&g_cs);
cout<<“fThread1 —-: “<<i<<” “<<j<<endl;
LeaveCriticalSection(&g_cs);
Sleep(1);
}
}
return 0;
}
DWORD WINAPI fThread2(LPVOID lpParameter)
{
int i,j;
for(i=0;i<3;i++)
{
EnterCriticalSection(&g_cs);
for(j=0;j<3;j++)
{
//EnterCriticalSection(&g_cs);
cout<<“fThread2 ****: “<<i<<” “<<j<<endl;
//LeaveCriticalSection(&g_cs);
Sleep(1);
}
LeaveCriticalSection(&g_cs);
Sleep(1);
}
return 0;
}
int main()
{
HANDLE hThread1;
HANDLE hThread2;
cout<<“init: “<<endl;
InitializeCriticalSection(&g_cs);
hThread1 = CreateThread(NULL,0,fThread1,NULL,0,NULL);
hThread2 = CreateThread(NULL,0,fThread2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
Sleep(4000);
DeleteCriticalSection(&g_cs);
return 0;
}
运行结果显示:
这个运行结果说明锁定区间内,其他程序不能打扰,抢占资源。
线程1加锁在内循环,每次锁定一行显示,而线程2加锁在for(j=…) 外围,所以每次锁定3行显示。线程2结束后,资源就全是线程1的了。
为了对比,修改线程2 加锁的位置,也到最内循环,结果如下:
可以看到,线程显示是交替的。线程1显示1行,线程2显示1行,直到结束。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/12822.html