线程同步--关键代码段(一)
2012-09-20 17:49
211 查看
线程同步有四种方式
但是在一个进程中,效率最高的,方式是 :关键代码段
主要实现的是:两个list链表,主线程获取本地时间的秒值,秒值若是奇数就存入list_1中,否则就存入list_1中。
开两个线程分别从list里面获取数据,然后写入本地文件里面
其中出现了了一个问题
在debug模式下面没出问题,但是在release模式下面出现了错误!
但是在一个进程中,效率最高的,方式是 :关键代码段
#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模式下面出现了错误!
相关文章推荐
- 利用关键代码段实现线程同步
- window下线程同步之(Critical Sections(关键代码段、关键区域、临界区域)
- 利用关键代码段实现线程同步
- 线程同步 关键代码段 CRITICAL_SECTION 用户模式同步对象 InitializeCriticalSection
- VC++多线程,互斥对象,事件对象,关键代码段实现线程同步
- VC++深入详解——第16章:线程同步,关键代码段
- 多线程编程Demo[关键代码段[临界区]实现线程同步]
- -【用户方式线程同步】关键代码段
- window下线程同步之(Critical Sections(关键代码段、关键区域、临界区域)
- windows多线程系列004_利用关键代码段实现线程同步
- 使用关键代码段实现线程同步
- Windows多线程程序设计之线程同步分析(结合临界区(关键代码段))
- C++多线程编程例子 Demo 关键代码段 临界区 实现线程同步
- 线程同步使用方法:CMutex_CEvent_关键代码段
- 线程同步--关键代码段(二)
- 利用关键代码段实现线程同步
- 使用关键代码段实现线程同步
- 使用关键代码段实现线程同步
- java非常有用的代码段(关键时候可以看看)
- 个人的关键代码段封装