线程同步(临界区的使用)

1.SingalObject

#include <windows.h>
#include <iostream>

using namespace std;

CRITICAL_SECTION cs;

int m = 0;
int n = 0;
DWORD WINAPI ThreadProc(LPVOID Param);
int main()
{

InitializeCriticalSection(&cs);

int a = 10;
HANDLE ThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc,NULL, 0, NULL);

EnterCriticalSection(&cs);
for (int i = 0;i<1000;i++)
{
m++;
n++;
printf("Main Thread\r\n");
}
LeaveCriticalSection(&cs);
WaitForSingleObject(ThreadHandle, INFINITE);

1.SingalObeject
DeleteCriticalSection(&cs);
printf("%d %d\r\n", m, n);

}

DWORD WINAPI ThreadProc(LPVOID Param)
{
EnterCriticalSection(&cs);
for (int i = 0; i < 1000; i++)
{

printf("Sub Thread\r\n");
m++;
n++;
}
LeaveCriticalSection(&cs);
return 0;
}

2.MultipleObject

#include <windows.h>
#include <iostream>

using namespace std;

CRITICAL_SECTION cs;

int m = 0;
int n = 0;
DWORD WINAPI ThreadProc(LPVOID Param);

int main()
{

HANDLE ThreadHandle[5] = { 0 };
InitializeCriticalSection(&cs);

for (int i = 0; i < 5; i++)
{
ThreadHandle[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, NULL, 0, NULL);
}

WaitForMultipleObjects(5, ThreadHandle, TRUE, INFINITE);
DeleteCriticalSection(&cs);
printf("%d %d\r\n", m, n);
}

DWORD WINAPI ThreadProc(LPVOID Param)
{
CRITICAL_SECTION cs;

EnterCriticalSection(&::cs);   //注意(&::cs)
for (int i=0;i<10000;i++)
{
m++;
n++;
}
LeaveCriticalSection(&::cs);  //注意(&::cs)

return 0;
}

时间: 2024-11-04 16:54:10

线程同步(临界区的使用)的相关文章

java线程 同步临界区:thinking in java4 21.3.5

thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155 package org.rui.thread.critical; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutorService; import java.uti

高级线程同步 临界区

高级线程同步关键代码段1.原子操作.2.临界区指定一个CRITICAL_SECTION 数据结构g_cs,然后对EnterCriticalSection和LeaveCriticalSection访问共享资源当拥有一项可供多个线程访问的资源时,应该创建临界区.类似多个人上厕所.如果多个不是一道线程使用的资源,比如线程1和线程2访问一个资源,线程1和线程3访问另一个资源.那么应该为每个资源创建独立的厕所. 缺点无法对多个进程中的各线程进行同步. 初始化:InitializeCriticalSecti

线程同步-临界区对象

1.临界区对象 临界区是保证在某一个时间只有一个线程可以访问数据的方法.使用它的过程中,需要给各个线程提供一个共享的临界区对象,无论哪个线程占有临界区对象,都可以访问受到保护的数据,这时候其它的线程需要等待,直到该线程释放临界区对象为止,临界区被释放后,另外的线程可以强占这个临界区,以便访问共享的数据. 2.主要的函数方法 InitializeCriticalSection(&cs);//初始化临界区 EnterCriticalSection(&cs);//进入临界区 LeaveCriti

线程同步之临界区

临界区:当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件.导致竞态条件发生的代码区称作临界区.临界区线程同步适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率比较高. 在.Net中有Monitor.Lock等方式是以临界区的方式来实现线程同步的,我们看一下两者的具体示例. 1.Lock  Lock关键字将代码块标记为临界区,方法是获取指定对象的互斥锁,执行语句,然后释放锁,这样其它线程就可以接着获取锁来进入临界区. Lock关键字保

win32多线程 (二)线程同步之临界区 (critical sections)

所谓critical sections 意指一小块“用来处理一份被共享之资源”的程序代码.你可能必须在程序的许多地方处理这一块可共享的资源.所有这些程序代码可以被同一个critical  section 保护起来.为了阻止问题发生,一次只能有一个线程获准进入critical  section 中.critical section 并不是核心对象.使用方法: CRITICAL_SECTION g_section; 1:初始化 InitializeCriticalSection(&g_section

临界区,互斥量,信号量,事件的区别(线程同步)

(转)临界区,互斥量,信号量,事件的区别(线程同步) (转)临界区,互斥量,信号量,事件的区别(线程同步) . 分类: C++ windows 核心编程 2012-04-10 14:55 3321人阅读 评论(0) 收藏 举报 semaphoremfcnulleventsthreadhttp服务器 四种进程或线程同步互斥的控制方法 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 2.互斥量:为协调共同对一个共享资源的单独访问而设计的. 3.信号量:为控制一个

Visual C++线程同步技术剖析:临界区,事件,信号量,互斥量

转自: 使线程同步 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的了解应当在其处理任务完成后进行. 如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解.例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题.如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数

Delphi多线程的OnTerminate属性(附加一个关于临界区线程同步的例子)

首先看TThread源码中关于OnTerminate的代码: public .... property OnTerminate: TNotifyEvent read FOnTerminate write FOnTerminate; ... end; 再看Delphi自带的帮助手册中对于OnTerminate的解释: Occurs after the thread's Execute method has returned and before the thread is destroyed. p

(转)临界区,互斥量,信号量,事件的区别(线程同步)

(转)临界区,互斥量,信号量,事件的区别(线程同步) 分类: C++ windows 核心编程 2012-04-10 14:55 2064人阅读 评论(0) 收藏 举报 semaphore mfc null events thread http服务器 四种进程或线程同步互斥的控制方法 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 2.互斥量:为协调共同对一个共享资源的单独访问而设计的. 3.信号量:为控制一个具有有限数量用户资源而设计. 4.事 件:用来通

Windows线程同步【2】临界区

临界区是线程同步的一种实现方式.Windows提供了4个关于临界区的函数(InitializeCriticalSection,EnterCriticalSection,LeaveCriticalSection,DeleteCriticalSection),要想使用这些函数,必须先有一个临界区变量, CRITICAL_SECTION cs; 临界区变量,不能复制,不能移动,也不能读取里面的字段(可以取临界区变量的地址).总而言之,我们在编写程序时,必须把临界区变量当成一个黑箱,一切对临界区的操作必