首页 > 编程语言 >win32多线程编程与锁

win32多线程编程与锁

时间:2022-12-19 17:39:30浏览次数:51  
标签:NULL WINAPI 编程 LPVOID hmutex win32 ti DWORD 多线程


模拟售票程序。


未加锁程序:


#include <iostream.h>
#include <windows.h>

int index = 0;
int ti = 100;

DWORD WINAPI fun1(
LPVOID lpParameter
);
DWORD WINAPI fun2(
LPVOID lpParameter
);
void main()
{
HANDLE hthread1;
hthread1 = CreateThread(NULL,0,fun1,NULL,0,NULL);
CloseHandle(hthread1);
HANDLE hthread2;
hthread2 = CreateThread(NULL,0,fun2,NULL,0,NULL);
CloseHandle(hthread2);

Sleep(4000);//这样主线程不占用CPU

}

DWORD WINAPI fun1(
LPVOID lpParameter
)
{
while(true)
{

if (ti>0)
{

ti--;
cout<<"thread 11111:"<<ti<<endl;

}
else
break;


}

return 0;
}
DWORD WINAPI fun2(
LPVOID lpParameter
)
{
while(true)
{

if (ti>0)
{

ti--;
cout<<"thread 22222:"<<ti<<endl;
Sleep(5);

}
else
break;


}
return 0;
}


加锁程序:


#include <iostream.h>
#include <windows.h>

int index = 0;
int ti = 100;
HANDLE hmutex;//锁
DWORD WINAPI fun1(
LPVOID lpParameter
);
DWORD WINAPI fun2(
LPVOID lpParameter
);
void main()
{
HANDLE hthread1;
hthread1 = CreateThread(NULL,0,fun1,NULL,0,NULL);
CloseHandle(hthread1);
HANDLE hthread2;
hthread2 = CreateThread(NULL,0,fun2,NULL,0,NULL);
CloseHandle(hthread2);
hmutex = CreateMutex(NULL,TRUE,NULL);
// WaitForSingleObject(hmutex,INFINITE);
ReleaseMutex(hmutex);
Sleep(4000);//这样主线程不占用CPU

}

DWORD WINAPI fun1(
LPVOID lpParameter
)
{
while(true)
{
WaitForSingleObject(hmutex,INFINITE);
if (ti>0)
{

ti--;
cout<<"thread 11111:"<<ti<<endl;

}
else
break;
ReleaseMutex(hmutex);

}

return 0;
}
DWORD WINAPI fun2(
LPVOID lpParameter
)
{
while(true)
{
WaitForSingleObject(hmutex,INFINITE);
if (ti>0)
{

ti--;
cout<<"thread 22222:"<<ti<<endl;
Sleep(5);

}
else
break;
ReleaseMutex(hmutex);

}
return 0;
}


可以根据运行结果比较区别,未加锁程序显然存在BUG,多次售同一张票。

标签:NULL,WINAPI,编程,LPVOID,hmutex,win32,ti,DWORD,多线程
From: https://blog.51cto.com/u_15917617/5953238

相关文章

  • 网络编程
    网络编程网络基础网络概念概念:两台或多台设备通过一定物理设备连接起来构成了网络根据网络的覆盖范围不同,对网络进行分类:局域网:覆盖范围最小,仅仅覆盖个教室或一个机......
  • 13个自学编程的坑(来自老韩的忠告)
    1计算机基础很重要,很重要2选择适合自己的语言,不纠结,不同语言适用场景不同,不同语言逻辑语法大同小异,触类旁通,推荐学JAVA,简单上手并好就业一些3动手写代码非常重要,光看......
  • delphi D11编程语言手册 匿名方法(P479-495)
      这本书可以在Delphi研习社②群256456744的群文件里找到.书名:Delphi11AlexandriaEdition.pdf 匿名方法可以让我们把一个方法的实际代码当成参数来进行传......
  • VC 编程技巧 (一)
    (1)如何通过代码获得应用程序主窗口的指针?主窗口的指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。AfxGetMainWnd()->ShowWindow(SW_SHOWMAXMIZED)//使......
  • linux多线程随机数,随机数SecureRandom在Linux下阻塞
    https://blog.csdn.net/weixin_35973521/article/details/116813890-Djava.security.egd=file:/dev/./urandomhttps://blog.csdn.net/weixin_32159771/article/details/1......
  • 并发编程(一)之线程的创建和启动
    并发编程之线程的创建和启动一、线程创建1.1.实现​​Runnable​​接口实现​​Runnable​​​接口,重写​​run​​​方法,实现​​Runnable​​​接口的实现类的实例对象作......
  • 死磕Java多线程之线程池的基本使用与核心原理
    Java多线程之线程池一、线程池的自我介绍1.线程池的重要性(为什么使用线程池)线程池可以应对突然大爆发量的访问,通过有限个固定线程为大量的操作服务,减少创建和销毁线程所需......
  • C#多线程(四)并行编程篇之结构化
    C#多线程(四)并行编程篇之结构化 前言在前三章中我们的案例大量使用到了Thread这个类,通过其原始API,对其进行创建、启动、中断、中断、终止、取消以及异常处理,这样的写......
  • PLC 状态机编程第七篇 - 仿真运行
    我们就以星三角为例,演示仿真运行。。假设你已完成状态机,保存路径选择如下:点击Models标签,然后点击ModelSettings,进入ConfigurationParameters界面。点击Solv......
  • springboot实现AOP切面编程
    概述AOP(AspectOrientedProgramming)即面向切面编程。面向切面是面向对象中的一种方式而已。在代码执行过程中,动态嵌入其他代码,叫做面向切面编程(将交叉业务逻辑封装成成......