进程共同实现某个任务或者共享计算机资源, 它们之间存在两种关系:

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多线程编程的更多相关文章

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

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

  2. Windows多线程编程入门

    标签(空格分隔): Windows multithread programming 多线程 并发 编程 背景知识 在开始学习多线程编程之前,先来学习下进程和线程 进程 进程是指具有一定独立功能的程序在 ...

  3. windows多线程编程实现 简单(1)

    内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...

  4. Windows多线程编程总结

    1 内核对象 1 .1 内核对象的概念 内核对象是内核分配的一个内存块,这种内存块是一个数据结构,表示内核对象的各种特征.并且只能由内核来访问.应用程序若需要访问内核对象,需要通过操作系统提供的函数来 ...

  5. windows多线程编程(一)(转)

    源出处:http://www.cnblogs.com/TenosDoIt/archive/2013/04/15/3022036.html CreateThread:Windows的API函数(SDK函 ...

  6. Windows多线程编程入门笔记

    每次处理并行任务时,如果要等待用户输入或依赖外部(如与灿亨控制器响应),就应该为类似的操作单独创建一个线程,这样我们的程序才不会挂起无响应. 静态库和动态库 静态库是指在程序运行前就编译完成的库,如# ...

  7. Windows平台下的多线程编程

    线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件.信号标识及动态分配的内存等.一个进程内的所有线程使用同一个地址空间,而这些线程的执行由系统调度 ...

  8. Win32多线程编程(1) — 基础概念篇

      内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...

  9. 【转】Windows的多线程编程,C/C++

    在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex). CreateThread 和 ExitThread    使 ...

随机推荐

  1. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  2. Windows Form调用R进行绘图并显示

    R软件功能非常强大,可以很好的进行各类统计,并能输出图形.下面介绍一种R语言和C#进行通信的方法,并将R绘图结果显示到WinForm UI界面上. 1 前提准备 安装R软件,需要安装32位的R软件,6 ...

  3. px-rem px转换为rem的工具

    将px转换为rem的工具,github地址:https://github.com/finance-sh/px-rem 将px转换为rem的工具 怎样转换静态文件 安装: npm install px- ...

  4. HTML5本地存储Localstorage

    什么是localstorage 前几天在老项目中发现有对cookie的操作觉得很奇怪,咨询下来是要缓存一些信息,以避免在URL上面传递参数,但没有考虑过cookie会带来什么问题: ① cookie大 ...

  5. C# Session添加、删除封装类

    /// <summary> /// <para> </para> /// 常用工具类——Session操作类 /// <para> ---------- ...

  6. 关getClass().getClassLoader()

    InputStream   is   =   getClass().getClassLoader().getResourceAsStream("helloworld.properties&q ...

  7. HTML中的标记-遁地龙卷风

    第三版 上一版本在未经验证的情况下,盲目的认为很多东西是那样,造成错误,非常抱歉. 0.什么是标记 <input type="checkbox" checked />& ...

  8. ArcGIS Engine开发前基础知识(2)

    ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...

  9. VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式

    [1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...

  10. React Native知识11-Props(属性)与State(状态)

    一:Props(属性) 大多数组件在创建时就可以使用各种参数来进行定制.用于定制的这些参数就称为props(属性).props是在父组件中指定,而且一经指定,在被指定的组件的生命周期中则不再改变 通过 ...