线程同步--关键代码段(一)
来源:互联网 发布:男性家暴 知乎 编辑:程序博客网 时间: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模式下面出现了错误!
- 线程同步--关键代码段(一)
- 线程同步--关键代码段
- 利用关键代码段实现线程同步
- 使用关键代码段实现线程同步
- -【用户方式线程同步】关键代码段
- 线程同步--关键代码段(二)
- 线程同步--关键代码段(三)
- 线程同步使用方法:CMutex_CEvent_关键代码段
- 关键代码段实现线程同步
- 使用关键代码段实现线程同步
- 利用关键代码段实现线程同步
- 线程同步之关键代码段
- 利用关键代码段实现线程同步
- 线程同步之关键代码段
- 利用关键代码段(临界区)实现线程同步
- 线程同步二:关键段
- 线程同步--关键段CRITICAL_SECTION
- 线程同步之关键段
- Delphi就能实现WAP服务器程序
- JS去掉字符串两边(左右)的空格(js去空格)
- QA是个什么样的工作?
- Iovec,Msghdr
- MD5
- 线程同步--关键代码段(一)
- 开源项目之Android繁体中文输入法
- SIP深入学习---- 建立通讯
- weblogic adminserver启动正常,console无法登录,关闭报Destination unreachable
- java中如何实现对已有图片的部分截图
- Java中HashMap遍历的两种方式
- HDU 1213
- 英语练习27 He usually plays tennis
- 消失的网页:信息衰减正在蚕食我们的历史