#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线程同步的四种方法的更多相关文章

  1. linux实现共享内存同步的四种方法

    https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...

  2. Linux下线程同步的几种方法

    Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码.  1. 初始化锁 int pthrea ...

  3. 归纳一下:C#线程同步的几种方法

    转自原文 归纳一下:C#线程同步的几种方法 我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在后台处理一大堆数据,但还要使用户界面处于可操作状态:或者你的程序需要访问一些外部资源如数据库 ...

  4. java中线程同步的几种方法

    1.使用synchronized关键字 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态. 注: synchro ...

  5. Java修炼——线程同步的俩种方法

    当多线程去同时抢占CPU资源时,有多线程的安全问题.这时候就需要将线程同步.线程同步有俩个方法. 1.同步代码块(synchronize),同步代码块需要同步监视器,同步监视器是针对对象进行操作.什么 ...

  6. Java中实现线程同步的三种方法

    实现同步的三种方法 多线程共享数据时,会发生线程不安全的情况,多线程共享数据必须同步. 实现同步的三种方法: 使用同步代码块 使用同步方法 使用互斥锁ReetrantLock(更灵活的代码控制) 代码 ...

  7. Java线程同步的四种方式详解(建议收藏)

    ​ Java线程同步属于Java多线程与并发编程的核心点,需要重点掌握,下面我就来详解Java线程同步的4种主要的实现方式@mikechen 目录 什么是线程同步 线程同步的几种方式 1.使用sync ...

  8. C++线程同步的四种方式(Windows)

    为什么要进行线程同步? 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的 ...

  9. C#线程同步的几种方法

    一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做同步,volatile的含义就是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我. ...

随机推荐

  1. git submodule相关操作

    $ cd 项目目录 // 初始化 $ git init $ git submodule add https://github.com/XXXX // 普通更新 $ git submodule upda ...

  2. 【转载】pygame安装与两种版本的Python兼容问题

    在开始学习游戏编程之前,我们先来安装下pygame和python3.2.5 参考园友: http://www.cnblogs.com/hongten/p/hongten_pygame_install. ...

  3. GridControl/GridView的分组操作

    今天在模块编写中碰到了对表格的分组,特意在这里把它记录下来. 一.背景:Dev14.1.3,GridControl,.NET4.0+C# 二.过程 1.GridControl设计 一共添加4列:在下面 ...

  4. Java 四舍五入并小数点后保存两位,千分位分隔

    import java.text.DecimalFormat; public class FileTest {    public static void main(String[] args) {  ...

  5. FZU 2238 Daxia & Wzc's problem

    公式. $a×C_{m + i - 1}^m + d×C_{m + i - 1}^{m + 1}$. 推导过程可以看http://blog.csdn.net/queuelovestack/articl ...

  6. Python学习笔记——基础篇【第五周】——正在表达式(re.match与re.search的区别)

    目录 1.正在表达式 2.正则表达式常用5种操作 3.正则表达式实例 4.re.match与re.search的区别 5.json 和 pickle 1.正则表达式   语法: import re # ...

  7. [M]MagicTable转换异常解决方法

    ApplicationClass转换为_Application异常 这个问题可能是以前安装过不同版本的Office,没有完全卸载时导致的,可尝试通过以下方法解决: 1. 卸载Office,在 控制面板 ...

  8. linux(x64)下安装Matlab 2015b破解版(含安装包)

    注意:在安装前请查看安装目录是否有足够空间!完全安装大概需要12G的空间!本人在安装后系统盘满了,导致无法启动图形界面.小伙伴们不要重蹈覆辙~ Environment Linux debian8 (x ...

  9. stylus or less ?

    为什么不说SASS? 因为它需要安装Ruby,而一般的前端开发人员是不会特地去安装Ruby.我似乎更喜欢nodejs! ok,那么我们怎么在stylus和less 之间做出一个好的选择呢? 首先我本人 ...

  10. EFI、GPT和BIOS、MBR

    用了数十年的PC机主板架构是BIOS模式.但在2004年,微软和英特尔共同推出一种名为可扩展固件接口(EFI)的主板升级换代方案.EFI,即可扩展固件接口(Extensible Firmware In ...