线程同步有四种方式
但是在一个进程中,效率最高的,方式是 :关键代码段
#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模式下面出现了错误!