您的位置:首页 > 其它

CRITICAL_SECTION的使用例子

2014-10-13 08:10 253 查看
下面以对stl::list容器的操作作为例子,list如果不处理好,容易出错。所以更能看出效果。

下面一个线程是实现读取和删除的同步。

#include "stdafx.h"
#include <WinSock2.h>//内包含CRITICAL_SECTION
#include <list>
#include <process.h>
using namespace std;
CRITICAL_SECTION g_cs; 
list<int> int_list;
unsigned int __stdcall read_thread(void *p)
{
	for(;;)
	{
		EnterCriticalSection(&g_cs);
		list<int>::iterator iter;
		for(iter = int_list.begin(); iter != int_list.end() ;iter++)
		{
			printf("%d\n",*iter);
		}
		LeaveCriticalSection(&g_cs);	
		if(int_list.size() == 0) break;
		printf("\\\\\\\\\\\\\\\n");
		Sleep(500);//控制显示间隔时间,去掉可以更能看出效果
	}

	return 1;
}
unsigned int __stdcall delete_thread(void *p)
{
	for(;;)
	{
		EnterCriticalSection(&g_cs);
		list<int>::iterator iter;
		if(int_list.size() == 0){printf("清空完毕!\n");break;}
		for(iter = int_list.begin(); iter != int_list.end() ;iter++)
		{
			int_list.erase(iter);
			break;
		}
		LeaveCriticalSection(&g_cs);
		Sleep(1000);
	}
	
	return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
InitializeCriticalSection(&g_cs);
for(int i = 0; i != 10 ; ++i)
	int_list.push_back(i);
_beginthreadex(0,0,read_thread,0,0,0);
_beginthreadex(0,0,delete_thread,0,0,0);
scanf("%s");
DeleteCriticalSection(&g_cs);
return 0;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: