C++并发
申小远
这个作者很懒,什么都没留下…
展开
-
windows并发编程API(一)
HANDLEWINAPICreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ SIZE_T dwStackSize, _In_ LPTHREAD_START_ROUTINE lpStartAddress, _In_opt_ __drv_aliasesMem LPVOID lp...原创 2018-07-28 15:33:48 · 693 阅读 · 0 评论 -
条件变量
条件变量(condition_variable): 假设现在有两个线程A和B,当线程A执行到一定程度时才能让线程B执行,这个时候就需要条件变量了,我们设置一个全局变量,初始条件为假,线程B等待条件为真,向下执行,条件由线程A设置为真。 这样的需求,就好像是线程B一直在轮询条件,但是在轮询的过程中会一直消耗CPU,导致资源的浪费,所以就设置了通知机制,当线程A将条件设为真之后通知B。 另外就是...原创 2018-08-26 16:15:59 · 768 阅读 · 0 评论 -
互斥量mutex
互斥量是将资源互斥,即进程在某一相同的程序时,可以将某一程序片段设定为互斥量,线程不能同时访问此代码段,只有当前线程退出此互斥锁,另一线程才可以进入// mutex互斥量.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <thread>#include <cstdio>#include <iostr...原创 2018-08-02 09:53:43 · 706 阅读 · 0 评论 -
一个原子操作的小例子-赛跑
生命一个atomic_flag对象,此对象是一个BOOL类的变量,有两种操作test_and_set 将atomic_flag对象设置为true并获得设置之前的值,如果atomic_flag为false,则test_and_set会将此值设置为true并返回false,如果为true,则设置为true,并返回true clear 将atomic_flag变量设置为false,无返回值...原创 2018-08-02 09:22:25 · 885 阅读 · 0 评论 -
原子操作atomic
C++中有atomic类和atomic_flag两个类,其中atomic类用于定义一个原子操作,atomic_flag定义一些与原子操作相关的函数如下操作:// atomic原子操作.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <atomic>#include <iostream>#include...原创 2018-08-02 08:55:58 · 924 阅读 · 0 评论 -
信号量
信号量(Semaphore)也是多线程控制中的同步机制,临界区每一只允许有一个进程访问临界资源,信号量可以设置多个进程同时访问某一资源,在设置的线程数范围内,每增加一个线程,信号量的计数就会减1,直至计数减为0,不再发出信号,其他线程不能再访问共享资源,一旦有线程完成任务,退出访问共享资源,信号量计数就会加1,产生信号,其他线程可以进入HANDLE WINAPI CreateSemap...原创 2018-07-30 22:07:54 · 270 阅读 · 0 评论 -
线程死锁产生的必要条件
互斥条件:一个资源每次只能被一个进程使用 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放 不可剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺 循环等待条件:若干进城之间形成一种头尾相接的循环等待资源关系死锁演示程序:// 死锁.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <proces...原创 2018-07-30 20:06:45 · 372 阅读 · 0 评论 -
windows并发编程API(五)-应用
火车票两个窗口售票,两个窗口(开启两个线程)同时在售票,总票数n张,两个窗口单独售票,使用的API如下:_beginthread//创建线程WaitForMultipleObject//阻塞等待线程执行Sleep//线程休眠 程序例程:// 两个窗口售卖火车票.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include...原创 2018-07-29 19:26:41 · 355 阅读 · 0 评论 -
windows并发编程API(四)
在使用涉及到CRT存储堆操作的CRT库函数中的多线程编程中,使用CreateThread来开始线程是很危险的,容易造成线程的意外终止,windows核心编程中推荐使用_beginthread、_beginthreadx和相对应的_endthread、_endthreadx函数uintptr_t _beginthread( // NATIVE CODE void( __cdecl *st...原创 2018-07-28 19:33:22 · 227 阅读 · 0 评论 -
windows并发编程API(三)
DWORD WINAPI WaitForMultipleObjects( _In_ DWORD nCount, _In_ const HANDLE *lpHandles, _In_ BOOL bWaitAll, _In_ DWORD dwMilliseconds);nCount-要等待的线程的个数 lpHandles-句柄数组名...原创 2018-07-28 18:39:28 · 340 阅读 · 0 评论 -
windows并发编程API(二)
DWORD WINAPI WaitForSingleObject( _In_ HANDLE hHandle, _In_ DWORD dwMilliseconds);等待线程执行hHandle-线程句柄 dwMilliseconds-等待毫秒数,设置为INFINITE,则为无线等待,有点join的意思返回参数WAIT_ABANDONED WAIT_OBJE...原创 2018-07-28 16:57:06 · 247 阅读 · 0 评论 -
自旋锁
C++11 版不带自旋锁的API,我们可以手动实现,有的时候线程执行的功能比较简单,或者说代码量较少,如果使用mutex的话,开销比较大,但是使用mutex的锁,线程处于非运行态时不占用CPU,这是其他的线程可以运行,使用自旋锁时线程被阻塞,但是被阻塞线程依然不会让出CPU,而是会不断的while来检查锁的状态,有点浪费CPU,所以自旋锁一般适用于简短的不耗时的线程 自旋锁可以使用如下方式来实现...原创 2018-08-25 21:08:21 · 2969 阅读 · 0 评论