#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. 四位len灯流水

    #include <msp430x14x.h> //#include<intrins.h> #define uint unsigned int void delay(long ...

  2. html使用css让文字多行超出部分用省略号三个点显示的方法案例

    text-overflow: -o-ellipsis-lastline;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-w ...

  3. Python 清理HTML标签类似PHP的strip_tags函数功能(二)

    没有发现Python 有现成的类似功能模块,所以昨天写了个简单的 strip_tags 但还有些问题,今天应用到采集上时进行了部分功能的完善, 1. 对自闭和标签处理 2. 以及对标签参数的过滤 fr ...

  4. 运行CUDA实例时候出现的问题

    问题一:>LINK : fatal error LNK1123: 转换到 COFF 期间失败:文件无效或损坏 将 项目——项目属性——配置属性——连接器——清单文件——嵌入清单 “是”改为“否” ...

  5. Openjudge-NOI题库-出书最多

    描述 假定图书馆新进了m(10 ≤ m ≤ 999)本图书,它们都是由n(2 ≤ n ≤ 26)个作者独立或相互合作编著的.假设m本图书编号为整数(1到999),作者的姓名为字母('A'到'Z'),请 ...

  6. PQ分区魔术师v9.0 中文版

    软件名称: pqmagic 硬盘分区大师9.0中文绿色版 软件大小:5.80MB 软件语言:简体中文 软件类别:磁盘工具 软件授权:免费软件 更新时间:2013-10-082013-10-08 09: ...

  7. 《CSS网站布局实录》读书笔记

    从Web标准.HTML标记.CSS语法基础介绍到实用技巧,事无巨细.实体书已不印刷,只能下载电子版 书的背景: 国内第一本web标准的CSS布局书,2006年9月第一版,作者李超. 环境背景: 当时主 ...

  8. jquery如何获取url中问号后面的数值

    假如路径是这样的:www.domain.com/list/?menu=1 var locationUrl = location.search.substring(6); switch(location ...

  9. 移动端rem适配问题

    将下面这段代码,放在头部的script标签里,可解决字体适配问题 比例是28px = 1rem function __setFontSize__(){document.documentElement. ...

  10. linux重要目录说明

    1 home :root用户的home 目录是root,普通用户的home 目录是/home,users/(不要随便使用root权限,小白容易改错东西哒) 2 bin:常用可执行文件:/bin./us ...