多线程中线程锁的使用

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


相关推荐

  • request对象详解

    request对象详解 2018年10月27日15:45:51于易动 申请对象:类型:HttpServletRequest的:请求对象:封装了请求头信息,请求体信息等   .1:特点:类型:HttpServletRequest 2:生命周期:   诞生:客户端浏览器每次发出请求,都会创建一个响应对象。   销毁:服务方法执行完毕就会销毁   .3:请求对象的作用: a:作为域对象…

    2022年6月6日
    61
  • js中的prototype的解析

    js中的prototype的解析js的方法可以分为三种:对象方法、类方法、prototype方法//对象方法functionPeople(name){this.name=name;this.introduct=function(){alert(“Mynameis”+this.name);console.log(“Mynameis”+this.name);}}//类方法Peop

    2022年7月23日
    11
  • 相机标定(Camera calibration)原理、步骤

    相机标定(Camera calibration)原理、步骤&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这已经是我第三次找资料看关于相机标定的原理和步骤,以及如何用几何模型,我想十分有必要留下这些资料备以后使用。这属于笔记总结。1.为什么要相机标定?&amp;nb

    2022年5月28日
    162
  • 豆包生图怎么破甲

    豆包生图怎么破甲

    2026年3月12日
    1
  • 动态规划——背包问题(详解)

    动态规划——背包问题(详解)动态规划是我最早接触的算法,一开始非常简单,固定模板题,后来愈发愈发难起来了,条件,状态压缩等等,难点主要是,状态怎么表示,状态转移方程怎么写,这篇文章将会从背包五大问题详解,希望能帮助到大家去类比,思考其他动态规划题目。首先先来看看动态规划的定义:动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。

    2022年7月26日
    25
  • mac系统pycharm配置python环境_mac pycharm怎么设置环境

    mac系统pycharm配置python环境_mac pycharm怎么设置环境安装了pycharm,创建了测试项目,发现python的版本是2.6.9的,系统自带的版本好像是2.7的,为什么怎么样,怎么切换到2.7看了一下系统到底装了些什么版本居然有两个版本接下来设置解释器的路径Pycharm>Preferences>Build,Excution,Deployment>Console>PythonConsole设

    2022年8月25日
    15

发表回复

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

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