在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(php环境) 安装ffmpeg
实现上传视频获取视频的第一帧当做视频封面 1.安装ffmpeg ffmpeg的下载链接 https://ffmpeg.org/download.html 解压安装包 tar -jxvf ffmpeg ...
- 蓝牙bluez学习(1) Stack Architecture
Bluez支持的features Core Specification 4.2 (GAP, L2CAP, RFCOMM, SDP, GATT) Classic Bluetooth (BR/EDR) B ...
- Jvm:性能调优监控工具
现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 .... ...
- python基础知识01-数据类型和序列类型
%,取余 //,取整,向下取整,5//2 = 2. 一.变量类型 1.变量名不能以数字开头,不能纯数字,不要用汉字,可以用下划线开头 2.数值类型(int,float,bool,complex) ...
- Django 多个字段关联同一外键
# -*- coding: utf-8 -*- """ Tencent is pleased to support the open source community b ...
- php 复制文件夹
public function recurse_copy($src,$des) { $dir = opendir($src); @mkdir($des); while(false !== ( $fil ...
- 跟初学者学习IbatisNet第四篇
这一章我们主要介绍一下IbatisNet里面的其它用法主要有以下几点: 1,如何得到运行时ibatis.net动态生成的SQL语句? 2,如何获取DbCommand? 3,如何返回DataTable, ...
- spring的IOC底层原理
我们调用一个类的方法,首先是User user=new User(),对象调用这个方法,user.add(),这种方法有一个缺陷就是代码的耦合度太高,比如你的servlet调用User类里的方法,需 ...
- NYOJ-517-最小公倍数,大数啊~~~
最小公倍数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致.但也并非纯粹的偶然:60是个优秀的数字,它的 ...
- bzoj3142[Hnoi2013]数列 组合
Description 小 T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察 到:除第一天外每天的股价都 ...