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. 【HDU1879】继续畅通工程(MST基础题)

    真心大水题...不多说. #include <iostream> #include <cstring> #include <cstdlib> #include &l ...

  2. 【jquery插件】-网页下雪效果

        又到了年底,从圣诞节开始,可以发现各大网站的活动是越来越多,都变的银装素裹,本人由于业务需求也需要做这么一个效果,所以就通过google大神找了一下相关资源,结果就出现了N种雪花效果的方式.种 ...

  3. Hive 8、Hive2 beeline 和 Hive jdbc

    1.Hive2 beeline  Beeline 要与HiveServer2配合使用,支持嵌入模式和远程模式 启动beeline 打开两个Shell窗口,一个启动Hive2 一个beeline连接hi ...

  4. SPRING+JNDI+C3P0 in tomcat6

    Tomcat 中Jndi是使用Tomcat自带的连接池,由于客户要求,抛弃Tomcat自带的连接池.使用c3p0 .经过几个小时调试,解决方案如下: 环境:Tomcat 6 下面来看Jndi 与 c3 ...

  5. qt model/view 架构基础介绍之QTreeWidget

    # -*- coding: utf-8 -*- # python:2.x #说明:QTreeWidget用于展示树型结构,也就是层次结构同前面说的 QListWidget 类似,这个类需要同另外一个辅 ...

  6. Mac截屏快捷键总结

    Mac截屏快捷键总结 1)Command-Shift-3: 将整个屏幕拍下并保存到桌面. 2)Command-Shift-Control-3:     将整个屏幕拍下并保存到剪贴板(Clipboard ...

  7. JSP九大内置对象和四种属性范围解读

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文首先主要解说了JSP中四种属性范围的概念.用法与实例. 然后在这个基础之上又引入了九 ...

  8. 多线程 AfxBeginThread 与 CreateThread 的区别

      简言之:  AfxBeginThread是MFC的全局函数,是对CreateThread的封装. CreateThread是Win32 API函数,前者最终要调到后者. 1>.具体说来,Cr ...

  9. gcc基本用法

    GCC基本用法 GCC最基本的用法是: gcc [option] filenames option:编译器所需要的编译选项 filenames:要编译的文件名 gcc编译流程 都以 hello.c 为 ...

  10. Sql server Lock

    http://www.cnblogs.com/wuyifu/archive/2013/11/28/3447870.html