多线程中线程锁的使用

多线程中线程锁的使用在多线程的程序编写中,常常遇到共享资源使用冲突解决的苦恼。终于看到并测试了一种简单方法。线程锁的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)


相关推荐

  • laravel 常用文档

    laravel 常用文档

    2021年10月22日
  • 使用flyio全局拦截ajax「建议收藏」

    使用flyio全局拦截ajax「建议收藏」1.场景如果我们在已经开发好的一个网站上优化,做ajax请求缓存,不确定他使用了什么ajax工具,应该怎么做。假如开发者使用的是axios,jquery等,我们可以在其中使用axios和jquery的拦截器做拦截。但是flyio提供了一个更简单的方法。2.使用1.安装flyionpminstallflyio–save2.使用如下使用,即可拦截全局的ajaximportflyfrom’flyio’;importEngineWrapperfrom’flyio/dis

  • Typora设置图片存储路径「建议收藏」

    Typora设置图片存储路径「建议收藏」Typora设置图片存储路径Typora设置图片存储路径Typora设置图片存储路径最近经常在用Typora编写文档,每次剪切的图都是默认保存在C盘中Typora默认的保存图片的文件夹中,每次找起来不是很方便,所有最近想设置下剪切图片保存的位置。因为这东西不常用,想想还是记录下来点击文件,选择偏好设置原来是无特殊操作,个人还是倾向于选择图中选项选择此选项后会,在md文档所在文件夹中…

  • vdbench的作用_Vdbench—-文件系统IO,一致性校验,常见问题

    vdbench的作用_Vdbench—-文件系统IO,一致性校验,常见问题Linux环境—-多客户联机运行注意,此时会出现avahi-daemon服务的报错日志信息:关闭即可:systemctlstopavahi-daemonavahi-daemon是一种Linux操作系统上运行在客户机上实施查找基于网络的Zeroconfservice的服务守护进程。该服务可以为Zeroconf网络实现DNS服务发现及DNS组播规范。用户程序通过LinuxD-Bus信息…

  • 数据的四大特性_质量具有的四种特性

    数据的四大特性_质量具有的四种特性事务具有四个特征:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性简称为ACID特性。1

  • navicate 15.0.25 激活码【2021.7最新】[通俗易懂]

    (navicate 15.0.25 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~ML…

发表回复

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

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