多线程中线程锁的使用

多线程中线程锁的使用在多线程的程序编写中,常常遇到共享资源使用冲突解决的苦恼。终于看到并测试了一种简单方法。线程锁的5个要素:CRITICAL_SECTIONg_cs; //定义线程锁InitializeCriticalSection(&g_cs);  //初始化DeleteCriticalSection(&g_cs);  //删除EnterCriticalSection(&g_c…

大家好,又见面了,我是你们的朋友全栈君。

在多线程的程序编写中,常常遇到共享资源使用冲突解决的苦恼。终于看到并测试了一种简单方法。

线程锁的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行,直到结束。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152050.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号