windows多线程没那么难
来源:互联网 发布:怎么做淘宝优惠券群主 编辑:程序博客网 时间:2024/06/05 06:08
windows多线程没那么难
作者:vpoet
mail:vpoet_sir@163.com
上一博文中我们引入了CreateThread()多线程编程一个简单的例子,事实上我说windows
多线程没那么难,那是为了安慰你,但是不要怕,困难时让人克服的。再大的困难也难不
倒英雄的中国程序员。
下面我又要介绍一个多线程的问题:
我们首先看一个Demo,经典的卖票问题,同一张牌不能卖出去两次:
#include <windows.h>#include <stdio.h>static int number=20;DWORD WINAPI ThreadOne(LPVOID lpParameter){while(1){if(number>0){printf("窗口1售出第%d张票...\n",number);Sleep(1000);number--;}}return 0;}DWORD WINAPI ThreadTwo(LPVOID lpParameter){while(1){if(number>0){printf("窗口2售出第%d张票...\n",number);Sleep(1000);number--;}}return 0;}int main(){HANDLE HOne,HTwo;printf("***********************vpoet******************\n");HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL);printf("窗口1售票开始:\n");HTwo=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);printf("窗口2售票开始:\n");CloseHandle(HOne);CloseHandle(HTwo);while(TRUE){if(number==0){printf("MainThread Over!\n");return 0;}else{continue;}}return 0;}运行结果:
看到没,出现了同一张票卖两次的情况,这是绝对错误的,是违反能量守恒定律的。
这是为什么呢,因为我们对全局变量操作两个线程在同时进行,如果在窗口1线程的number++
之前,窗口2线程取出了number这时的number还并未自加,所以出现了同一张票
卖两次的情况
那么我们就要用线程同步的方法来控制,怎么控制呢,在windows下控制
多线程同步一般有几种方法:临界区对象,事件对象和互斥对象以及锁
下面主要介绍临界区对象进行线程同步:
下面主要介绍临界区对象进行线程同步:
在win API中:
该函数为初始化临界区函数,参数为临界区对象
该函数等待指定的临界区对象的所有权,当获取指定的临界区对象的所有权之后该函数返回
其参数为临界区对象指针
该函数释放指定临界区对象的所有权,参数为临界区对象指针
该函数为删除释放临界区对象资源
那么接下来我们将用临界区对程序进行改写:
#include <windows.h>#include <stdio.h>static int number=10;CRITICAL_SECTION Section;DWORD WINAPI ThreadOne(LPVOID lpParameter){while(1){EnterCriticalSection(&Section);if(number>0){printf("窗口1售出第%d张票...\n",number);number--;Sleep(1000);}LeaveCriticalSection(&Section);}return 0;}DWORD WINAPI ThreadTwo(LPVOID lpParameter){while(1){EnterCriticalSection(&Section);if(number>0){printf("窗口2售出第%d张票...\n",number);Sleep(1000);number--;}LeaveCriticalSection(&Section);}return 0;}int main(){HANDLE HOne,HTwo;InitializeCriticalSection(&Section);printf("***********************vpoet******************\n");HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL);printf("窗口1售票开始:\n");HTwo=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);printf("窗口2售票开始:\n");CloseHandle(HOne);CloseHandle(HTwo);while(TRUE){if(number==0){printf("不好意思,票卖完了!\n");DeleteCriticalSection(&Section);return 0;}else{continue;}}return 0;}运行结果如下:
这下票卖对了吧。
好了,Only stop here!
下面的博文我将介绍其他几种线程同步的方法。
1 0
- windows多线程没那么难
- windows多线程没那么难
- 其实没那么难
- 其实没那么难
- 移动办公没那么简单,也没那么难
- openfire插件没那么难
- LinkList其实没那么难
- 对症下药,营销没那么难
- 支出,没那么,那么,
- 看看多线程,其实没那么可怕----小话多线程(1)
- 看看多线程,其实没那么可怕----小话多线程(1)
- 随笔-UITableViewCell 自定义也没那么难
- android中微信支付!! 其实没那么难
- block没那么难(一)
- block没那么难(二)
- block没那么难(一)
- block没那么难(二)
- block没那么难(三)
- LintCode Delete Element 删除元素
- TTS---android 中TextToSpeech的用法
- iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束
- java 并发操作之原子性与可视性
- LeetCode | Search in Rotated Sorted Array II
- windows多线程没那么难
- android actionbar
- iOS自动布局autolayout(1)
- 巧用C#webbrowser以及Application.DoEvents()实现采集动态网页的爬虫机器人
- Android在本地实现验证码的验证
- Python在HTTP接口测试中的应用
- iOS 8 Auto Layout界面自动布局系列3-使用代码添加布局约束
- sqlserver2008中cast和convert函数--类型转换
- leetcode 26 Remove Duplicates from Sorted Array