在VC6.0中多线程编程演示样例(带同步信号量)
直接上代码:
#include <windows.h>//必要的头文件,使用Windows API函数
#include <stdio.h> int index = 0;
int tickets = 100;//票数
HANDLE hMutex; //使用全局的相互排斥对象来保证对同一资源的相互排斥訪问与操作这里是tickets
//线程处理函数原型,形式可从MSDN中拷贝 //线程1 的入口函数 DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter); void main()
{
HANDLE hThread1;
DWORD thread1ID;
//创建线程1
hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, &thread1ID);
HANDLE hThread2;
DWORD thread2ID;
//创建线程2
hThread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, &thread2ID);
CloseHandle(hThread1); //关闭线程的句柄,为什么要关闭?它将线程的使用计数减1
CloseHandle(hThread2);//这样当线程结束时,线程内核对象被释放,
//否则仅仅有当进程结束。才释放线程的内核对象hThread1与hThread
//创建一个相互排斥对象,假设成功返回相互排斥对象的句柄,否则返回NULL
hMutex = CreateMutex(NULL, FALSE, "tickets");
if (hMutex)
{
if(ERROR_ALREADY_EXISTS == GetLastError())
{
puts("only one instance can run!");
return;
}
}
Sleep(4000);//主线程睡眠4秒钟,给其他线程执行的时间,由于一旦主线程退出则进行退出,其他线程也将退出
} DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while(TRUE)
{
WaitForSingleObject(hMutex, INFINITE);//假设全局相互排斥对象是有信号状态,则获得该对象,
//直到调用ReleaseMutex之前,相互排斥对象是无信号状态,其他线程不能对相互排斥对象进行訪问
if(tickets > 0)
{
Sleep(1);
printf("Thread1 sell tickets : %d\n", tickets-- );
}
else
break;
ReleaseMutex(hMutex);//将相互排斥对象设置为有信号状态 }
return 0; }
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while(TRUE)
{
WaitForSingleObject(hMutex, INFINITE);
if (tickets > 0)
{
Sleep(1);
printf("Thread2 sell tickets : %d\n", tickets-- );
}
else
break;
ReleaseMutex(hMutex);
}
return 0;
}
在VC6.0中多线程编程演示样例(带同步信号量)的更多相关文章
- Android之——多线程下载演示样例
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载.Android API中明 ...
- C++ Primer中文本查询演示样例Query的实现
近期在看C++ Primer复习C++的语法,看到书中15.9章中的文本查询演示样例时,认为设计得非常不错,于是便动手照着实现了一个,改动了非常久最终执行成功了,从中也学习到了非常多的语法.以下把实现 ...
- 01_MUI之Boilerplate中:HTML5演示样例,动态组件,自己定义字体演示样例,自己定义字体演示样例,图标字体演示样例
1安装HBuilder5.0.0,安装后的界面截图例如以下: 2 依照https://www.muicss.com/docs/v1/css-js/boilerplate-html中的说明,创建上 ...
- MVC模式编程演示样例-登录验证(静态)
好,上篇博客分享了本人总结的JSP-Servlet-JavaBean三层架构编程模式的实现思想和基本流程,接下来给大家分享一个MVC编程模式的实现演示样例-登录验证的过程,这里我仍然用的是静态的验证u ...
- socket编程演示样例(多线程)
client代码例如以下: import java.io.*; import java.net.*; import java.util.Scanner; public class SimpleChat ...
- Libevent 学习笔记 (1)——Libevent 2.0安装与简单演示样例
今天開始学习Libevent . Libevent 是开源社区的一款高性能I/O框架库. 主要特点有: 1 跨平台. 2 统一事件源 3 线程安全 4 基于Reactor 今天主要进行了Libeven ...
- 【UNIX网络编程(三)】TCP客户/server程序演示样例
上一节给出了TCP网络编程的函数.这一节使用那些基本函数编写一个完毕的TCP客户/server程序演示样例. 该样例运行的过程例如以下: 1.客户从标准输入读入一行文本,并写给server. 2.se ...
- 源代码方式向openssl中加入新算法完整具体步骤(演示样例:摘要算法SM3)【非engine方式】
openssl简单介绍 openssl是一个功能丰富且自包括的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘要).大数运算. ...
- Java多线程演示样例(模拟通话,sleep,join,yield,wait,notify,Semaphore)
主线程等待子线程的多种方法 synchronized浅析 sleep 是静态方法,Thread.sleep(xx)谁调用谁睡眠. join 是合并方法.当前线程调用其它线程xx.join()则等到xx ...
随机推荐
- Linux基础学习-通过VM安装RHEL7.4
虚拟机安装RHEL7.4 1.VM虚拟机设置 这里我们配置的虚拟机为1核1G,50G硬盘,NAT模式 2.Linux安装 这里时区我们选择中国上海,时间需要调整一下相差8小时. 这里添加一下中文语言支 ...
- 虚拟机如何设置静态IP
一.本机环境 Mac.VMware Fusion 10, CentOS6.8 二.设置静态IP地址 1.选择网络连接模式,选择NAT模式 注意: 1)必须要选择NAT模式,否则你的虚拟机与主机始终会在 ...
- Android开发——获取应用数据/缓存大小并清理缓存
1. 获取应用数据/缓存大小 其中pm为实例化的PackageManager,因为需要遍历所有的已安装的应用.因此需要开启子线程进行处理. 还有需要注意的是,在Android4.2之前getPacka ...
- winform中ComboBox控件的简单使用
在开发winform中用到了ComboBox,但是发现和asp.net中的DropDownList差别比我想象中的大. 给ComboBox添加数据总结的有两种方法(绑定数据库在这里不说): 第一种方法 ...
- spring用到的设计模式
https://www.cnblogs.com/yuefan/p/3763898.html https://www.cnblogs.com/hwaggLee/p/4510687.html https: ...
- HDU1757-A Simple Math Problem,矩阵快速幂,构造矩阵水过
A Simple Math Problem 一个矩阵快速幂水题,关键在于如何构造矩阵.做过一些很裸的矩阵快速幂,比如斐波那契的变形,这个题就类似那种构造.比赛的时候手残把矩阵相乘的一个j写成了i,调试 ...
- .NET下 JSON 的一些常用操作
1.JSON的序列化和反序列化 Newtonsoft.Json dll 下载地址http://json.codeplex.com/ using System; using System.Collect ...
- c++之析构函数
#include<iostream>using namespace std;class A{ public: A(){cout<<"A constructi ...
- C语言一些常见的操作字符串方法
// 首字母大写 ;(c=string[i])!='\0';i++) // 字符串碰到\0结束 C知识 { if (c==' ') { printf("%c",c), word=; ...
- linux rdesktop远程Win7老是提示密码错误问题解决
最近使用rdesktop远程Win7老是提示密码错误,输了N次,无比确认密码是正确的. 在Win7系统本身登录也是正常的. 但rdesktop远程就是报密码错误. 开始怀疑更新了最新版本问题,但是使用 ...