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

来源:互联网 发布:男性家暴 知乎 编辑:程序博客网 时间:2024/04/30 10:32

 

线程同步有四种方式

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

 

#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);//清空listlist1.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模式下面出现了错误!