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

 

线程同步有四种方式

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

 

#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模式下面出现了错误!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值