在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 ...
随机推荐
- Floyd算法简单实现(C++)
图的最短路径问题主要包括三种算法: (1)Dijkstra (没有负权边的单源最短路径) (2)Floyed (多源最短路径) (3)Bellman (含有负权边的单源最短路径) 本文主要讲使用C++ ...
- Canvas标签
1.Canvas标签: HTML5<canvas>元素用于图形的绘制,通过脚本(通常是javascript)来完成<canvas>标签只是图形容器,必须使用脚本来绘制图形.你可 ...
- htmlpurifier的使用
什么是htmlpurifier?? HTML Purifier是一个可以用来移除所有恶意代码(XSS),而且还能确保你的页面遵循W3C的标准规范的PHP类库. 在php里解决XSS最简单的方法是使用h ...
- 阿里云服务器ecs配置之安装mysql
安装mysql数据库 1.安装工作: 下载 mysql 源安装包 [root@ming ~]# wget http://dev.mysql.com/get/ ...
- LeetCode07--整数反转
''' 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 ...
- Spring拓展接口之BeanPostProcessor,我们来看看它的底层实现
前言 开心一刻 小明:“妈,我被公司开除了”,妈:“啊,为什么呀?”, 小明:“我骂董事长是笨蛋,公司召开高层会议还要起诉我”,妈:“告你诽谤是吧?”,小明:“不是,他们说要告我泄露公司机密” Bea ...
- OO第二单元博客
三次作业的设计策略 第一次作业 多线程协同控制 第一次作业只需要两个线程和一个公共缓冲区: 负责读取输入并把它添加进命令队列的线程,即生产者 负责从命令队列中取出命令执行的线程,即消费者 再加上一个缓 ...
- 【01】sass基础信息:
[01]基础信息: 2016年4月16日 最新版本:3.4.22 官网:http://sass-lang.com/(下图) CSStoSCSS 网站:http://css2sa ...
- 大数据学习——mapreduce案例join算法
需求: 用mapreduce实现select order.orderid,order.pdtid,pdts.pdt_name,oder.amount from orderjoin pdtson ord ...
- WebStorm下载安装
下载地址:https://www.jetbrains.com/webstorm/ 注册码: http://idea.codebeta.cn