您的位置:首页 > 编程语言

线程同步--关键代码段(一)

2012-09-20 17:49 211 查看
线程同步有四种方式

但是在一个进程中,效率最高的,方式是 :关键代码段



#include <iostream>
#include <windows.h>
#include <fstream>
#include <list>
using namespace std;

DWORD WINAPI ListProc1( LPVOID lpParameter );     //    list1线程函数
DWORD WINAPI ListProc2( LPVOID lpParameter );	  //   list2线程函数
DWORD WINAPI ThProc( LPVOID lpParameter );	      //时间函数,设置退出时间

CRITICAL_SECTION cs;
int flag = 1;      //退出标志

list<int> list1;
list<int> list2;

int main(int argc, char* argv[])
{

	HANDLE hand1;
	HANDLE hand2;
	HANDLE hand ;
	SYSTEMTIME systi;
	InitializeCriticalSection(&cs);
	
	
	hand = CreateThread(NULL , 0 , ThProc , NULL , 0 , NULL );          //时间线程
	hand1 = CreateThread(NULL , 0 , ListProc1 , NULL , 0 , NULL );      //   list1线程
	hand2 = CreateThread(NULL , 0 , ListProc2 , NULL , 0 , NULL );      //   list2线程

	while (flag)
	{

		GetLocalTime(&systi);  //获取当前时间 

		EnterCriticalSection(&cs);     //进入临界资源区
		if ( ( systi.wSecond % 2 )== 0 )
		{
			list1.push_front(systi.wSecond);
		}
		else
		{
			list2.push_front(systi.wSecond);
		}
		LeaveCriticalSection(&cs);		//离开临界资源区
		Sleep(50);
	}
	
	//等待线程结束
	WaitForSingleObject(hand ,INFINITE );
	WaitForSingleObject(hand1 , INFINITE);
	WaitForSingleObject(hand2 , INFINITE);

	DeleteCriticalSection(&cs);

	//清空list
	list1.clear();
	list2.clear();

	cout<<"over!"<<endl;
	
	return 0;
}

//时间函数,设置退出时间
DWORD WINAPI ThProc( LPVOID lpParameter )
{
	for (int i = 0 ; i < 10 ; ++i  )
	{
		Sleep(1000);
	}
	
	flag = 0 ;
	return 0;
}

//     list1线程函数
DWORD WINAPI ListProc1( LPVOID lpParameter )
{
	fstream ffile1;
	ffile1.open("list_1.txt",ios::out|ios::binary);          //打开文件

	while (flag)                              //循环取出数据
	{
		if (!list1.empty() )
		{
			EnterCriticalSection(&cs);           //进入临界资源区

			ffile1<<list1.back()<<endl;
			cout<<list1.back()<<"     list1     "<<list1.size()<<endl;      //打印当前 存入当前文件的信息
			list1.pop_back();
		
			LeaveCriticalSection(&cs);          //退出临界资源区
		}
		Sleep(50);
	}

	ffile1.close();
	system("notepad list_1.txt");             //打开list_1.txt文件
	return 0;
}

//        list2线程函数
DWORD WINAPI ListProc2( LPVOID lpParameter )
{

	fstream ffile2;
	ffile2.open("list_2.txt",ios::out|ios::binary);
	while (flag)
	{
		if ( !list2.empty() )
		{
			EnterCriticalSection(&cs);

			ffile2<<list2.back()<<endl;
			cout<<list2.back()<<"     list2     "<<list2.size()<<endl; 
			list2.pop_back();

			LeaveCriticalSection(&cs);
		}
		Sleep(50);
	}

	ffile2.close();
	system("notepad list_2.txt");
	return 0;
}


主要实现的是:两个list链表,主线程获取本地时间的秒值,秒值若是奇数就存入list_1中,否则就存入list_1中。

开两个线程分别从list里面获取数据,然后写入本地文件里面





其中出现了了一个问题

在debug模式下面没出问题,但是在release模式下面出现了错误!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: