关于windows线程同步的四种方法
#include "stdafx.h"
#include "iostream"
#include "list"
#include "windows.h"
#include "process.h" using namespace std;
/*
线程同步
1.临界区
2.信号量
3.事件对象
4.互斥量
*/ /************************************************************************/
/* 临界区 单进程内线程同步 */
/************************************************************************/
CRITICAL_SECTION g_cri; //临界区
list<int> g_list2;
unsigned int __stdcall threadRead(LPVOID param)
{
while(true)
{
EnterCriticalSection(&g_cri);
for (list<int>::iterator it = g_list2.begin(); it != g_list2.end();it++)
{
cout << "元素为:"<<*it << endl;
}
LeaveCriticalSection(&g_cri);
Sleep();
}
return ;
} unsigned int __stdcall threadWrite(LPVOID param)
{
srand(GetTickCount());
while (true)
{
EnterCriticalSection(&g_cri);
if (g_list2.size()>)
{
if (rand() % > )
{
g_list2.push_back(rand());
}
else
{
g_list2.erase(g_list2.begin());
}
}
else
{
g_list2.push_back(rand());
}
LeaveCriticalSection(&g_cri);
Sleep();
}
return ;
} HANDLE g_mutex; //互斥量 unsigned int times = ;
/************************************************************************/
/* 互斥量 */
/************************************************************************/
unsigned int __stdcall firstThread(LPVOID param)
{
while (true)
{
WaitForSingleObject(g_mutex, INFINITE);
if (times <=)
{
cout << "线程1的第" << times++ << "次.." << endl;
}
else
{
break;
}
ReleaseMutex(g_mutex);
}
return ;
} unsigned int __stdcall secondThread(LPVOID param)
{
while (true)
{
WaitForSingleObject(g_mutex, INFINITE);
if (times <= )
{
Sleep();
cout << "线程2的第" << times++ << "次.." << endl;
}
else
{
break;
}
ReleaseMutex(g_mutex);
}
return ;
} /************************************************************************/
/* 事件对象 可对进程外的线程同步
CreateEvent(NULL, false, false, NULL);
setEvent(g_event);
*/
/************************************************************************/ HANDLE g_event;
unsigned int __stdcall firstThread2(LPVOID param)
{
while (true)
{
WaitForSingleObject(g_event, INFINITE);
if (times <= )
{
cout << "线程1的第" << times++ << "次.." << endl;
}
else
{
break;
}
SetEvent(g_event); }
return ;
} unsigned int __stdcall secondThread2(LPVOID param)
{
while (true)
{
WaitForSingleObject(g_event, INFINITE);
if (times <= )
{
Sleep();
cout << "线程2的第" << times++ << "次.." << endl;
}
else
{
break;
}
SetEvent(g_event);
}
return ;
} /************************************************************************/
/* 信号量 主要是可以指定个数
允许多个线程同一时刻访问同一资源,我们可以指定允许个数
*/
/************************************************************************/
HANDLE g_semaphore; unsigned int __stdcall firstThread3(LPVOID param)
{
while (true)
{
WaitForSingleObject(g_semaphore, INFINITE);
if (times <= )
{
cout << "线程1的第" << times++ << "次.." << endl;
}
else
{
break;
}
ReleaseSemaphore(g_semaphore, , NULL); }
return ;
} unsigned int __stdcall secondThread3(LPVOID param)
{
while (true)
{
WaitForSingleObject(g_semaphore, INFINITE);
if (times <= )
{
Sleep();
cout << "线程2的第" << times++ << "次.." << endl;
}
else
{
break;
}
ReleaseSemaphore(g_semaphore, , NULL); }
return ;
}
int _tmain(int argc, _TCHAR* argv[])
{
//InitializeCriticalSection(&g_cri); //初始化临界区
//g_mutex = CreateMutex(NULL, false, NULL); //创建互斥量 //g_event = CreateEvent(NULL, false, false, NULL); //可以根据第四个参数(线程名称)进行,不同进程的线程同步
//SetEvent(g_event); g_semaphore = CreateSemaphore(NULL, , , NULL); //信号量
HANDLE g_thread1 = (HANDLE)_beginthreadex(NULL, , firstThread3, NULL, , NULL);
HANDLE g_thread2 = (HANDLE)_beginthreadex(NULL, , secondThread3, NULL, , NULL); CloseHandle(g_thread1);
CloseHandle(g_thread2); cout << "主线程..\n";
Sleep(); system("pause");
return ;
}
关于windows线程同步的四种方法的更多相关文章
- linux实现共享内存同步的四种方法
https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...
- Linux下线程同步的几种方法
Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 1. 初始化锁 int pthrea ...
- 归纳一下:C#线程同步的几种方法
转自原文 归纳一下:C#线程同步的几种方法 我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在后台处理一大堆数据,但还要使用户界面处于可操作状态:或者你的程序需要访问一些外部资源如数据库 ...
- java中线程同步的几种方法
1.使用synchronized关键字 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态. 注: synchro ...
- Java修炼——线程同步的俩种方法
当多线程去同时抢占CPU资源时,有多线程的安全问题.这时候就需要将线程同步.线程同步有俩个方法. 1.同步代码块(synchronize),同步代码块需要同步监视器,同步监视器是针对对象进行操作.什么 ...
- Java中实现线程同步的三种方法
实现同步的三种方法 多线程共享数据时,会发生线程不安全的情况,多线程共享数据必须同步. 实现同步的三种方法: 使用同步代码块 使用同步方法 使用互斥锁ReetrantLock(更灵活的代码控制) 代码 ...
- Java线程同步的四种方式详解(建议收藏)
Java线程同步属于Java多线程与并发编程的核心点,需要重点掌握,下面我就来详解Java线程同步的4种主要的实现方式@mikechen 目录 什么是线程同步 线程同步的几种方式 1.使用sync ...
- C++线程同步的四种方式(Windows)
为什么要进行线程同步? 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的 ...
- C#线程同步的几种方法
一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做同步,volatile的含义就是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我. ...
随机推荐
- ViewController
ViewController ViewController 进入VC后先调用loadView,再调用ViewDidLoad ViewDidLoad皆为系统调用 需要先调用[super viewDidL ...
- 消息队列 RabbitMQ 与 Spring 整合使用
一.什么是 RabbitMQ RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.消 ...
- AutoCAD 2009及以上 32位&64位 官方原版下载地址
AutoCAD 2017 AutoCAD 2017 简体中文版 32位 http://trial2.autodesk.com/NET17SWDLD/2017/ACD/DLM/AutoCAD_2017_ ...
- linux配置更改yum源
1,进入yum源配置目录 cd /etc/yum.repos.d 2,备份系统自带的yum源mv CentOS-Base.repo CentOS-Base.repo.bk下载163网易的yum源:wg ...
- swift 中Value Type VS Class Type
ios 中Value Type 和 Class Type 有哪些异同点,这个问题是在微信的公共帐号中看到的,觉得挺有意思,这里梳理一下. 1.swift 中为什么要设置值类型? 值类型在参数传递.赋值 ...
- 用 monitorix 开启linux图形化监控
# yum install monitorix # service monitorix starthttp://host:8080/monitorix/
- js的兼容技巧
javascript原生代码中经常会遇到各式各样浏览器不兼容的问题,浏览器真是倔强,解决浏览器的兼容是前端猿们的一大难题 为了避免在工作中遇到这些简单的问题.节约开发时间,在这里总结一些常用的浏览器兼 ...
- 疯狂java讲义--笔记
第一章.Java语言概述与开发环境 什么是软件:一系列按照特定顺序组织的计算机数据和指令的集合: 交互方式:两种 GUI(Graphical User Interface) 图像界面 .CLI (Co ...
- Java开发工具
总的来看Java的开发工具无非由两个部分构成,一个JDK一个是IDE,无论JDK是不可变的,IDE则是哪个用着舒服就用哪个. 1JDK 1.1简介 JDK是 Java 语言的软件开发工具包(SDK), ...
- Linux常用命令汇总及使用方法(二)之文本编辑器VI
VI可能是在Linux中使用比较频繁的文本编辑器,如果不能熟练使用VI,在一定程度上会影响工作效率,所以在这里记录一下VI的常用命令及操作方式 在[root@test ~]# vi carrie.tx ...