windows多线程没那么难

作者:vpoet
mail:vpoet_sir@163.com

上一博文中我们引入了CreateThread()多线程编程一个简单的例子,事实上我说windows
多线程没那么难,那是为了安慰你,但是不要怕,困难时让人克服的。再大的困难也难不
倒英雄的中国程序员。

下面我又要介绍一个多线程的问题:
我们首先看一个Demo,经典的卖票问题,同一张牌不能卖出去两次:
 #include <windows.h>
#include <stdio.h> static int number=; DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
while()
{
if(number>)
{
printf("窗口1售出第%d张票...\n",number);
Sleep();
number--;
}
}
return ;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
while()
{
if(number>)
{
printf("窗口2售出第%d张票...\n",number);
Sleep();
number--;
}
}
return ;
} int main()
{
HANDLE HOne,HTwo;
printf("***********************vpoet******************\n");
HOne=CreateThread(NULL,,ThreadOne,NULL,,NULL);
printf("窗口1售票开始:\n");
HTwo=CreateThread(NULL,,ThreadTwo,NULL,,NULL);
printf("窗口2售票开始:\n");
CloseHandle(HOne);
CloseHandle(HTwo);
while(TRUE)
{
if(number==)
{
printf("MainThread Over!\n");
return ;
}
else
{
continue;
}
} return ;
}

运行结果:

 
看到没,出现了同一张票卖两次的情况,这是绝对错误的,是违反能量守恒定律的。
这是为什么呢,因为我们对全局变量操作两个线程在同时进行,如果在窗口1线程的number++
之前,窗口2线程取出了number这时的number还并未自加,所以出现了同一张票
卖两次的情况

那么我们就要用线程同步的方法来控制,怎么控制呢,在windows下控制
多线程同步一般有几种方法:临界区对象,事件对象和互斥对象以及锁
下面主要介绍临界区对象进行线程同步:



在win API中:


该函数为初始化临界区函数,参数为临界区对象




该函数等待指定的临界区对象的所有权,当获取指定的临界区对象的所有权之后该函数返回
其参数为临界区对象指针



该函数释放指定临界区对象的所有权,参数为临界区对象指针




该函数为删除释放临界区对象资源






那么接下来我们将用临界区对程序进行改写:
 #include <windows.h>
#include <stdio.h> static int number=;
CRITICAL_SECTION Section; DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
while()
{
EnterCriticalSection(&Section);
if(number>)
{
printf("窗口1售出第%d张票...\n",number);
number--;
Sleep();
}
LeaveCriticalSection(&Section);
}
return ;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
while()
{
EnterCriticalSection(&Section);
if(number>)
{
printf("窗口2售出第%d张票...\n",number);
Sleep();
number--;
}
LeaveCriticalSection(&Section);
}
return ;
} int main()
{
HANDLE HOne,HTwo;
InitializeCriticalSection(&Section);
printf("***********************vpoet******************\n");
HOne=CreateThread(NULL,,ThreadOne,NULL,,NULL);
printf("窗口1售票开始:\n");
HTwo=CreateThread(NULL,,ThreadTwo,NULL,,NULL);
printf("窗口2售票开始:\n");
CloseHandle(HOne);
CloseHandle(HTwo);
while(TRUE)
{
if(number==)
{
printf("不好意思,票卖完了!\n");
DeleteCriticalSection(&Section);
return ;
}
else
{
continue;
}
} return ;
}

运行结果如下:


这下票卖对了吧。

好了,Only stop here!
下面的博文我将介绍其他几种线程同步的方法。

windows多线程没那么难的更多相关文章

  1. windows多线程编程星球(一)

    以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...

  2. Windows多线程

    //简单的引出多线程是肿么回事儿....当点击下载的时候,下载内容还没结束也可以点击资源库,其实这就用了另一个线程,弹出“下载完成”对话框的时候,没有点击确定是不能点击主页面内容的,这就是用----- ...

  3. .NET C#到Java没那么难,Servlet篇

    前言 .NET C#到Java没那么难,都是面向对向的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到MVC,都是一样一样的,只是JAVA的配制项比较多而已,只要配好一个,后面都 ...

  4. Windows多线程多任务设计初步(转)

    Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程 ...

  5. block没那么难(二):block和变量的内存管理

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着 ...

  6. block没那么难(一):block的实现

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> block 顾名思义就是代码块,将 ...

  7. 总结windows多线程同步互斥

    windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...

  8. .NET C#转Java没那么难,开发环境篇

    .NET C#转Java没那么难,都是面向对向的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到MVC,都是一样一样的,只是JAVA的配制项比较多而已,只要配好一个,后面都是co ...

  9. .NET C#到Java没那么难,MVC篇

    最典型的JAVA MVC就是JSP + servlet + javabean的模式.比较好的MVC,老牌的有Struts.Webwork.新兴的MVC 框架有Spring MVC.Tapestry.J ...

随机推荐

  1. C# WEB API ApiController 修改response header contentType

    var res = Request.CreateResponse(HttpStatusCode.OK, file); res.Content.Headers.ContentType = new Med ...

  2. MySQL数据库配置主从服务器实现双机热备

    转自:http://www.cnblogs.com/cchun/p/3712637.html 一.安装MySQL 说明:在两台MySQL服务器192.168.21.169和192.168.21.168 ...

  3. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅱ

    2.4.2初级实现 我们知道,基础数据结构是实现优先队列的起点.我们可以是使用有序或无序的数组或链表.在队列较小时,大量使用两种主要操作之一时,或是所操作元素的顺序已知时,它们十分有用.因为这些实现相 ...

  4. 【转】DM8168添加DSP音频编解码算法--集成现有voice或audio codec

    本文根据“How to integrate audio/voice in RPE in EZSDK.pdf”整理,建议读者直接下载,参考原文件.原文件下载链接: http://download.csd ...

  5. 后台数据导出为Excel

    数据导出的方法如下: 一.下载office的类库:microsoft.office.interop.excel.zip 根据电脑安装的office版本选择引入相应的类库,office2007选择12. ...

  6. Apache-rhel5.8环境下编译安装

    Apache安装过程 Step 1:安装包gcc或gcc-c++# yum install gcc#yum install gcc-c++ Step 2:安装包APR和APR-Utilapr-1.4. ...

  7. [汇编学习笔记][第五章[BX]和loop指令]

    第五章[BX]和loop指令 前言 定义描述性符号“()”来表示一个寄存器或一个内存单元的内容,比如: (ax)表示ax中的内容,(al)表示al的内容. 约定符号ideta表示常量. 5.1 [BX ...

  8. Linux UGO和ACL权限管理

    自主访问控制(Discretionary Access Control, DAC)是指对象(比如程序.文件.进程)的拥有者可以任意修改或者授予此对象相应的权限.Linux的UGO(User, Grou ...

  9. iOS textfield限制长度,中文占2字符,英文占1字符

    之前遇到一种情况,限制textfield长度,并且要适配多语言,做到,例如中文占2字符,英文占1字符,还有考虑其他语言,网上找了很多方法,不太合适,最后结合网上的方案,修改出了还比较适用. 首先,增加 ...

  10. attr()和prop()的区别

    引用以为一位大神的文章: http://www.365mini.com/page/jquery-prop.htm http://www.365mini.com/page/jquery-attr-vs- ...