windows多线程编程
进程共同实现某个任务或者共享计算机资源, 它们之间存在两种关系:
1.同步关系, 指为了完成任务的进程之间, 因为需要在某些位置协调它们的执行顺序而等待, 传递消息产生的制约关系.
2.互斥关系, 进程间因相互竞争使用独占型资源所产生的制约关系, 如一个进程使用打印机,另一个进程必须等待它使用完后才可使用.
临界资源: 一次仅允许一个进程使(必须互斥使用)的资源, 如独占型硬件资源.....
临界段: 指各进程必须互斥执行的程序段, 该程序段实施对临界资源的操作.
关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将阻塞等待,直到该线程释放关键区的拥有权.
#include <windows.h>
#include <stdio.h> static int number=;
CRITICAL_SECTION CriticalSection; DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
printf("窗口1售票开始:\n");
while()
{
EnterCriticalSection(&CriticalSection);
if(number>)
{
printf("窗口1售出第%d张票...\n",number);
number--;
Sleep();
}
LeaveCriticalSection(&CriticalSection);
Sleep();
}
return ;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
printf("窗口2售票开始:\n");
while()
{
EnterCriticalSection(&CriticalSection);
if(number>)
{
printf("窗口2售出第%d张票...\n",number);
Sleep();
number--;
}
LeaveCriticalSection(&CriticalSection);
Sleep();
}
return ;
} int main()
{
HANDLE HOne,HTwo;
InitializeCriticalSection(&CriticalSection);
printf("***********************vpoet******************\n");
HOne=CreateThread(NULL,,ThreadOne,NULL,,NULL);
HTwo=CreateThread(NULL,,ThreadTwo,NULL,,NULL);
CloseHandle(HOne);
CloseHandle(HTwo);
while(TRUE)
{
if(number==)
{
printf("不好意思,票卖完了!\n");
DeleteCriticalSection(&CriticalSection);
return ;
}
else
{
continue;
}
} return ;
}
信号量机制: 由信号量和P操作,V操作两部分组成, 可以解决互斥与同步问题. 信号量(s)为一个整型变量, 只能被两个标准原语访问, 分别记为P操作和V操作.
定义如下:
P(s){
while s <=
; //空操作
s = s - ;
} V(s){
s =s + ;
}
信号量可以解决n个进程的临界段问题, n个进程共享一个公共变量mutex, 其初值为 1 , 任意一个进程Pi的结果如下:
do{
P(mutex);
critical secition
V(mutex);
non critical secition
}while();
信号量也可以解决进程间同步问题.
利用信号量解决线程同步问题
#include <windows.h>
#include <stdio.h> static int number=;
HANDLE Sem; DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
printf("窗口1售票开始:\n");
while()
{
// 信号量 > 0, 减去 1
WaitForSingleObject(Sem,INFINITE);
if(number>)
{
printf("窗口1售出第%d张票...\n",number);
number--;
Sleep();
}
// 信号量 < 0 , 加上 1
ReleaseSemaphore(Sem,,NULL);
Sleep();
}
return ;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
printf("窗口2售票开始:\n");
while()
{
WaitForSingleObject(Sem,INFINITE);
if(number>)
{
printf("窗口2售出第%d张票...\n",number);
Sleep();
number--;
}
ReleaseSemaphore(Sem,,NULL);
Sleep();
}
return ;
} int main()
{
HANDLE HOne,HTwo; printf("***********************vpoet******************\n");
HOne=CreateThread(NULL,,ThreadOne,NULL,,NULL);
HTwo=CreateThread(NULL,,ThreadTwo,NULL,,NULL);
//创建信号量, 初始为 1 , 最大计数为 1
Sem=CreateSemaphore(NULL,,,NULL);
CloseHandle(HOne);
CloseHandle(HTwo);
while(TRUE)
{
if(number==)
{
printf("不好意思,票卖完了!\n");
CloseHandle(Sem);
return ;
}
else
{
continue;
}
} return ;
}
信号量的具体实现:与进程调度相结合, 消除忙等待现象.
基本思想:
在P操作循环等待的地方介入放弃处理机, 进入等待对了动作.
在V操作时, 从等待队列中摘取进程变为就绪.
信号量定义
typedef struct{
int:value; 一个数值型变量
struct process *L;一个PCB队列
} Semaphore
Semaphore S;
P操作
P(S): S.Value=S.value-;
if S.value< then 保存现场,
将本进程挂入S.L队列,等待重新调度
请求分配一个S代表的资源, 若S.value < 0, 代表系统无此资源, 申请者阻塞.
V操作
V(S): S.value:=value+
if S.value≤ then 从S.L队列
取一进程,挂入就绪队列。
进程释放一个S代表的资源, 若S.value <= 0, 表示尚有进程在等待S而被阻塞, 所有要唤醒其一.
管程
共享资源用共享数据结构表示, 把分散的对共享资源的临界段集中于管程中, 管程中的临界程序一次只允许一个进程调用.
主要构成:共享数据结构, 对共享数据结构操作的一组函数, 数据结构的初始化程序.
互斥对象实现线程同步
互斥对象的所有权轮换给两个线程
#include <windows.h>
#include <stdio.h> static int number=;
HANDLE Mutex; DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
while()
{
//等待互斥对象有多有权才返回
WaitForSingleObject(Mutex,INFINITE);
if(number>)
{
printf("窗口1售出第%d张票...\n",number);
number--;
Sleep();
}
//释放互斥对象所有权
ReleaseMutex(Mutex);
}
return ;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
while()
{
WaitForSingleObject(Mutex,INFINITE);
if(number>)
{
printf("窗口2售出第%d张票...\n",number);
Sleep();
number--;
}
ReleaseMutex(Mutex);
}
return ;
} int main()
{
HANDLE HOne,HTwo;
Mutex=CreateMutex(NULL,FALSE,NULL);
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");
CloseHandle(Mutex);
return ;
}
else
{
continue;
}
} return ;
}
windows多线程编程的更多相关文章
- windows多线程编程星球(一)
以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...
- Windows多线程编程入门
标签(空格分隔): Windows multithread programming 多线程 并发 编程 背景知识 在开始学习多线程编程之前,先来学习下进程和线程 进程 进程是指具有一定独立功能的程序在 ...
- windows多线程编程实现 简单(1)
内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...
- Windows多线程编程总结
1 内核对象 1 .1 内核对象的概念 内核对象是内核分配的一个内存块,这种内存块是一个数据结构,表示内核对象的各种特征.并且只能由内核来访问.应用程序若需要访问内核对象,需要通过操作系统提供的函数来 ...
- windows多线程编程(一)(转)
源出处:http://www.cnblogs.com/TenosDoIt/archive/2013/04/15/3022036.html CreateThread:Windows的API函数(SDK函 ...
- Windows多线程编程入门笔记
每次处理并行任务时,如果要等待用户输入或依赖外部(如与灿亨控制器响应),就应该为类似的操作单独创建一个线程,这样我们的程序才不会挂起无响应. 静态库和动态库 静态库是指在程序运行前就编译完成的库,如# ...
- Windows平台下的多线程编程
线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件.信号标识及动态分配的内存等.一个进程内的所有线程使用同一个地址空间,而这些线程的执行由系统调度 ...
- Win32多线程编程(1) — 基础概念篇
内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...
- 【转】Windows的多线程编程,C/C++
在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex). CreateThread 和 ExitThread 使 ...
随机推荐
- Sublime Text 3 支持的热门插件推荐
SublimeText是一款非常精巧的文本编辑器,适合编写代码.做笔记.写文章.它用户界面十分整洁,功能非同凡响,性能快得出奇.这些非常棒的特性 包括任意跳转(Goto Anything).多重选择( ...
- JDK1.8 HashMap 源码分析
一.概述 以键值对的形式存储,是基于Map接口的实现,可以接收null的键值,不保证有序(比如插入顺序),存储着Entry(hash, key, value, next)对象. 二.示例 public ...
- springmvc配置文件web.xml详解各方总结(转载)
Spring分为多个文件进行分别的配置,其中在servlet-name中如果没有指定init-param属性,那么系统自动寻找的spring配置文件为[servlet-name]-servlet.xm ...
- 企业IT架构介绍
企业信息化之路 问题 互联互通 统一访问 统一身份管理 数据管理模型 企业数据集成业务架构 业务流程框架 业务流程模型 个性流程支持 跨业务的业务流程组合 EBS总线 ] SOA架构上视图 B ...
- MVC跨项目路由
我们在实际应用开发中,经常遇到多人共同开发维护同一个项目情况,所以不免会出现其中一个人代码出现bug质量问题导致整个项目就原地“爆炸”的惨状.在之前公司经常遇到某个人忘记更新(我就做个此事[" ...
- Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)
写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...
- ios新手开发——toast提示和旋转图片加载框
不知不觉自学ios已经四个月了,从OC语法到app开发,过程虽然枯燥无味,但是结果还是挺有成就感的,在此分享我的ios开发之路中的小小心得~废话不多说,先上我们今天要实现的效果图: 有过一点做APP经 ...
- 和transformjs一起摇摆
写在前面 记得以前facebook做过一款HTML5游戏.开场动画是一块软体类似豆腐的东西一起摇摆.类似的效果如下面的gif所示: facebook当时使用的是createjs下的子项目easeljs ...
- CALayer的transform属性
先来与View比较一下 View:transform -> CGAffineTransformRotate... layer:transform -> CATransform3DRotat ...
- Fresco从配置到使用(最高效的图片加载框架)
Frescoj说明: facebook开源的针对android应用的图片加载框架,高效和功能齐全. 支持加载网络,本地存储和资源图片: 提供三级缓存(二级memory和一级internal ...