线程同步-临界区对象

1、临界区对象

临界区是保证在某一个时间只有一个线程可以访问数据的方法。使用它的过程中,需要给各个线程提供一个共享的临界区对象,无论哪个线程占有临界区对象,都可以访问受到保护的数据,这时候其它的线程需要等待,直到该线程释放临界区对象为止,临界区被释放后,另外的线程可以强占这个临界区,以便访问共享的数据。

2、主要的函数方法

InitializeCriticalSection(&cs);//初始化临界区
EnterCriticalSection(&cs);//进入临界区
LeaveCriticalSection(&cs);//离开临界区
DeleteCriticalSection(&cs);//删除临界区

3、代码示例

全局变量声明:

int g_count1 = 0;
int g_count2 = 0;
BOOL g_bContinue = FALSE;

CRITICAL_SECTION g_cs;

线程处理函数:

UINT _stdcall ThreadFunc(LPVOID)//线程处理函数
{
	::EnterCriticalSection(&g_cs);//进入
	while( g_bContinue )
	{
		g_count1++;
		g_count2++;
	}
	::LeaveCriticalSection(&g_cs);//离开
	return 0;
}

调用函数:

void CMultiThreadSyncDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	g_count1 = g_count2 = 0;
	::InitializeCriticalSection(&g_cs);//初始化
	//g_sync_flag = FLAG_CRITICAL;
	g_bContinue = TRUE;
	UINT uId;
	HANDLE h[2];
	h[0] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId );
	h[1] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId );
	//等待
	Sleep(1000);
	g_bContinue = FALSE;
	::WaitForMultipleObjects(2, h, TRUE, INFINITE);
	::CloseHandle(h[0]);
	::CloseHandle(h[1]);
	::DeleteCriticalSection(&g_cs);//删除
	//CString str;
	//str.Format( _T("g_count1 = %d\r\ng_count2 = %d\r\n"),g_count1, g_count2);
	//m_fact.SetWindowText(str);
}
时间: 2024-11-06 15:12:29

线程同步-临界区对象的相关文章

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

Win32线程同步内核对象的比较

X86处理器上用户层到内核层的转换要花费600个CPU指令周期 临界区(关键代码段)不是内核对象 但当访问被占用的资源时会使用内核资源 功能同互斥但不可跨进程 (以上引用自:http://www.dewen.org/q/9561) WIN32内核对象都是由HANDLE操控 信号量(Semaphore) wait函数族使访问计数递减 当且仅当访问计数0时无信号 ReleaseSemaphore递增访问计数 互斥(Mutex) 有且仅有1个访问计数的信号量(二元信号量binary semaphore

线程同步——内核对象实现线程同步——信号量

1 /* 2 3 信号量内核对象 4 信号量与其它内核量相同,包含一个使用计数,除此之外还包含两个量. 5 一个最大资源计数和一个当前资源计数. 6 信号量规则如下: 7 如果当前资源计数大于0,那么信号量处于触发状态. 8 如果当前资源计数等于0,那么信号量处于未触发状态. 9 系统绝不会让当前资源计数变为负数. 10 当前资源计数绝不会大于最大资源计数. 11 12 下面我们看一下信号量的创建函数 13 HANDLE CreateSemaphore( 14 LPSECURITY_ATTRIB

线程同步——内核对象实现线程同步——事件内核对象

1 事件内核对象 2 3 事件类型对象有两种不同类型,手动重置和自动重置 4 手动重置:当一个手动重置对象被触发时候,等待该对象的所有线程变为可调度. 5 自动重置:当一个自动重置对象被触发时,只有一个等待该事件的线程会变为可调度 6 7 下面是一个创建事件内核对象的函数: 8 HANDLE CreateEvent( 9 LPSECURITY_ATTRIBUTES lpEventAttributes, 10 BOOL bManualReset, 11 BOOL bInitialState, 12

线程同步——内核对象实现线程同步——可等待计时器内核对象

1 可等待计时器 2 可等待计时器是这样一种内核对象,他们会在某个指定的时间触发或每隔一段时间触发一次. 5 下面我们来介绍一下创建可等待计时器函数: 6 7 HANDLE CreateWaitableTimer( 8 LPSECURITY_ATTRIBUTES lpTimerAttributes, 9 BOOL bManualReset, 10 LPCSTR lpTimerName ); 11 第一.三个参数我想我也不用介绍了哈,这是创建内核对象基本都会有的参数. 12 第二个参数bManua

线程同步——内核对象实现线程同步——等待函数

1 对于内核对象实现线程同步,不得不提三点: 2 1)大多数内核对象既有触发也有未触发两个状态 3 比如:进程.线程.作业.文件流.事件.可等待的计时器.信号量.互斥量 4 2)等待函数:等待函数使线程自愿进入等待状态,直到指定的内核对象变为触发状态为止, 5 说道等待我们最喜欢不过了,因为这样不会浪费我们宝贵的CPU时间. 6 3)对于自动重置对象来说,当对象被触发时,函数会自动检测到(手动重置对象为触发是,函数也能检测到), 7 并开始执行,但是在函数会在返回之前使事件变为非触发状态. 8

高级线程同步 临界区

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

多线程实现线程同步——事件对象

事件对象是指在程序中使用内核对象的有无信号状态实现线程的同步. 1.使用API函数操作事件对象 API函数为CreateEvent: 函数原型为: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SD BOOL bManualReset, // reset type BOOL bInitialState, // initial state LPCTSTR lpName // object name); 参数lpEve

线程同步(windows平台):互斥对象

一:介绍 互斥对象是系统内核维护的一种数据结构,保证了对象对单个线程的访问权. 二:函数说明 创建互斥对象:    HANDLE CreateMutex(            LPSECURITY_ATTRIBUTES lpMutexAttributes, 安全属性结构指针,可为NULL,表示默认安全性            BOOL bInitialOwner,     //是否占有该互斥量,TRUE:占有,FALSE:不占有            LPCTSTR lpName