线程同步有四种方式

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

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

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

  1. 线程同步--关键代码段(三)

    前面讲述了如何使用关键代码段. 但是关键代码段还有一些不为人知的秘密,也是多数程序员忽略的东西,特别是在多核cpu上面,我们必须知道的东西. 下面是<windows核心编程>这本书里面的一 ...

  2. 线程同步--关键代码段(二)

    在我们接触到的多线程书籍里面,提到最多的就是线程同步问题了. 但是,我们看到最多的例子也是对一个临界资源的访问. 但是当我们自认为感觉靴子很好的时候,问题出现了,怎么才能够使我们让线程按照一定的顺序访 ...

  3. Windows编程-- 用户方式中线程的同步---关键代码段(临界区)

    可以从例子学习,更好的掌握 #include <windows.h> #include <iostream.h> //两个线程的声明 DWORD WINAPI Fun1Proc ...

  4. 线程同步之关键代码段

    关键代码段: 1) 关键代码段(临界区)工作在用户方式下. 2) 关键代码段(临界区)是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权. 用InitializeCriticalSect ...

  5. VC++中多线程学习(MFC多线程)三(线程同步包含:原子互锁、关键代码段、互斥器Mutex、Semaphores(信号量)、Event Objects(事件))

    目录 ​​​​​​​​​​​​ 线程同步的必要性: 2.解决同步问题的方法 2.1原子互锁家族函数 2.2Critical Sections(关键代码段.关键区域.临界区域) 2.3 互斥器Mutex ...

  6. 【Window】线程同步方式1——临界区(关键代码段)

    第一节:[Window]创建线程的3种方式 第二节:[Window]线程同步概述 第三节:[Window]线程同步方式1--临界区(关键代码段) 第四节:[Window]线程同步方式2--互斥量 第五 ...

  7. 用Java线程获取优异性能(II)——使用同步连载线程访问关键代码部份

    摘要 开发者有时创建的多线程程序会生成错误值或产生其它奇怪的行为.古怪行为一般出现在一个多线程程序没使用同步连载线程访问关键代码部份的时候.同步连载线程访问关键代码部份是什么意思呢?在这篇文章中解释了 ...

  8. 秒杀多线程第五篇 经典线程同步 关键段CS

    上一篇<秒杀多线程第四篇 一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文首先介绍下如何使用关键段,然 ...

  9. 互斥对象与关键代码段的比较

    9.6.2 互斥对象与关键代码段的比较 就等待线程的调度而言,互斥对象与关键代码段之间有着相同的特性.但是它们在其他属 性方面却各不相同.表 9 - 1 对它们进行了各方面的比较. 表 9-1 互斥对 ...

最新文章

  1. vue中使用Base64编码和解码
  2. window.setTimeout() 和window.setInterval() 使用说明
  3. STM32F405的 ADC参考电压选择问题
  4. 【Python基础】Python 100 例带你入门
  5. 水晶底是什么材质_都是红酒杯,水晶的和玻璃的有什么区别?
  6. (转)认识原型对象和原型链
  7. top、kill实现进程结束
  8. eja智能压力变送器工作原理_eja变送器详解_eja变送器工作原理_eja变送器如何选型...
  9. Cocos Shader 图片去色变成灰色
  10. Android/iOS 终端快速截屏技巧
  11. MATLAB绘图函数fplot详解
  12. Java List集合排序 Java8 List集合排序方法 Java Lambda集合排序
  13. html+css+js制作LOL官网,web前端大作业(3个页面+模拟登录+链接)
  14. fms安装教程 linux_linux通过fms搭建流媒体服务器Flash Media Server
  15. 零磁通电流探头的原理和特性是什么?
  16. 智遥工作流为Sap报工时(实例)
  17. 史上最全!数据分析进阶教程,看这一篇就够了!
  18. 第九章 姜小白大难不死登君位 公子纠迟来一步梦成空
  19. xp无法访问2012r2域计算机列表,新安装Windows 2012域控无法没有自动创建Sysvol netlogon共享--钉子-Exchange MVP...
  20. cmd 下登陆ftp及相关操作

热门文章

  1. c语言log_C语言最大难点揭秘:编程的祸根!
  2. 计算机调剂到材料科学与工程,2019年郑州大学材料科学与工程专业考研调剂信息...
  3. deliphi 字符串分割_delphi中拆分字符串的函数
  4. C语言排序方法-----二分插入排序
  5. Ubuntu18.04全命令行在3090显卡上安装pytorch环境
  6. 查看指定进程io状态的iotop命令
  7. $_FILES[file]['error']
  8. zookeeper源码 — 一、单机启动
  9. python3中使用Redis
  10. 爬虫库之BeautifulSoup学习(五)