多线程中线程锁的使用

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


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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 玩转“网上邻居”之浏览服务原理(二)

    玩转“网上邻居”之浏览服务原理(二)

    2021年7月23日
    58
  • pycharm如何调试代码_pycharm怎么分段运行代码

    pycharm如何调试代码_pycharm怎么分段运行代码最全Pycharm教程(1)——定制外观  最全Pycharm教程(2)——代码风格  1、准备工作  (1)Python版本为2.7或者更高版本  (2)已经创建了一个python工程并且添加了内容,具体参考: GettingStartedtutorial  2、第一步——运行代码  打开之前编写的Solver.py文件,在编辑框中右键,选

    2022年8月27日
    4
  • vim搜索中文_vim编辑器搜索字符串

    vim搜索中文_vim编辑器搜索字符串2019独角兽企业重金招聘Python工程师标准>>>…

    2022年9月23日
    1
  • pycharm 2021.12.12激活码-激活码分享

    (pycharm 2021.12.12激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月30日
    49
  • xshell的安装和使用_git详细教程

    xshell的安装和使用_git详细教程1、Xshell6的安装废话不多说直接上链接:链接:https://pan.baidu.com/s/1WCOxkdhLIZj7yLakWu4Tdw提取码:t3ak2、了解Xshell及其使用2.1、Xshell是什么东西?首先我们要知道Xshell是用来干什么的。Xshell其实就是一个远程终端工具,它可以将你的个人pc(个人电脑)和你在远端的机器连接起来,通过向Xshell输入命令然后他通过网络将命令传送给远端Linux机器然后远端的Linux机器将其运行结果通过网络传回个人电脑。.

    2022年9月8日
    0
  • 安装pycharm教程最新版激活_Mac序列号

    安装pycharm教程最新版激活_Mac序列号激活码+汉化+Python安装包汉化下载汉化包resources_en.jar找到Pycharm,右键点击显示包内容,把resources_en.jar拷贝到/Applications/PyCharmCE.app/Contents/lib/里面重启Pycharm激活目前比较好用的Python开发工具是PyCharm,但是正版软件需要购买,要不然只能试…

    2022年8月28日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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