【av68676164(p31-p32)】Windows和Linux同步机制
2021-03-12 14:30
标签:number ase 重置 attribute 大于 long 最大值 leo nap 结果可能会出现不是240的情况 功能:等待目标对象变成有信号的状态返回 等待单个对象: 用于通知一个或多个线程某事件出现或某操作已经完成 进程调用wait(int status)会阻塞自己 父进程调用wait函数做善后工作 结论:对于普通变量,父子进程各自操作变量副本,互相不影响 对于文件,父子进程共享同一文件和读写指针 【av68676164(p31-p32)】Windows和Linux同步机制 标签:number ase 重置 attribute 大于 long 最大值 leo nap 原文地址:https://www.cnblogs.com/iamfatotaku/p/12590302.html4.6.1 Windows同步机制
临界区(CRITICAL_SECTION)
相关的API函数
初始化临界区
WINBASEAPI
VOID
WINAPI
InitializeCriticalSection(
_Out_ LPCRITICAL_SECTION lpCriticalSection
);
删除临界区
WINBASEAPI
VOID
WINAPI
DeleteCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
退出临界区(开锁)
WINBASEAPI
VOID
WINAPI
LeaveCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
例子
/*用3个线程共同把nSum累加到240*/
#include
等待函数
WINBASEAPI
DWORD
WINAPI
WaitForMultipleObjects(
_In_ DWORD nCount, // 等待的目标对象的数量
_In_reads_(nCount) CONST HANDLE* lpHandles, // 目标对象的句柄
_In_ BOOL bWaitAll, // 等待方式
_In_ DWORD dwMilliseconds // 等待时间,单位是毫秒
);
WINBASEAPI
DWORD
WINAPI
WaitForSingleObject(
_In_ HANDLE hHandle, // 等待的目标对象的句柄
_In_ DWORD dwMilliseconds // 等待时间,单位是毫秒
);
修改
/*用3个线程共同把nSum累加到240*/
#include
互斥量(Mutex)
用在互斥量上的函数
//创建互斥量
WINBASEAPI
_Ret_maybenull_
HANDLE
WINAPI
CreateMutexW(
_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
_In_ BOOL bInitialOwner, //初始化互斥量的状态:真或假
_In_opt_ LPCWSTR lpName //名字,可为null但不能跨进程用
);
//打开一个存在的互斥量
WINBASEAPI
_Ret_maybenull_
HANDLE
WINAPI
OpenMutexW(
_In_ DWORD dwDesiredAccess,
_In_ BOOL bInheritHandle,
_In_ LPCWSTR lpName //名字
);
WINBASEAPI
BOOL
WINAPI
ReleaseMutex(
_In_ HANDLE hMutex
);
//关闭互斥量
WINBASEAPI
BOOL
WINAPI
CloseHandle(
_In_ _Post_ptr_invalid_ HANDLE hObject //句柄
);
信号量(Semaphore)
用于信号量操作的API函数
//创建信号量
WINBASEAPI
HANDLE
WINAPI
CreateSemaphoreW(
_In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, //安全属性
_In_ LONG lInitialCount, //初始值
_In_ LONG lMaximumCount, //最大值
_In_opt_ LPCWSTR lpName //名字
);
//打开信号量
WINBASEAPI
_Ret_maybenull_
HANDLE
WINAPI
OpenSemaphoreW(
_In_ DWORD dwDesiredAccess, //存取方式
_In_ BOOL bInheritHandle, //能否被继承
_In_ LPCWSTR lpName //名字
);
//释放信号量
WINBASEAPI
BOOL
WINAPI
ReleaseSemaphore(
_In_ HANDLE hSemaphore, //句柄
_In_ LONG lReleaseCount, //释放数,使信号量的值增加的数量
_Out_opt_ LPLONG lpPreviousCount //得到释放前信号量的值
);
//关闭信号量
WINBASEAPI
BOOL
WINAPI
CloseHandle(
_In_ _Post_ptr_invalid_ HANDLE hObject //句柄
);
信号量的值可以通过相应的函数增或减
信号状态
使用信号量限制临界区访问的例子
#include
事件(Event)
事件对象的分类
Windows同步机制
临界区对象
EnterCriticalSection();
P操作
LeaveCriticalSection();
V操作
互斥量对象
ReleaseMutex()
V操作
事件对象
Bool SetEvent()
V操作
信号量对象
CreateSemaphore()
ReleaseSemaphore()
V操作
等待机制
WaitForSingleObject()
P操作
4.6.2 Linux同步机制
思考:程序运行流程?pid_1和pid_2的值
/*
先运行子进程,打印子进程的pid,然后返回父进程,父进程打印返回回来的子进程的pid
*/
#include
进程的阻塞wait()
进程的终结exit()
进程的休眠
父子共享普通变量
#include
父子进程共享文件资源
文章标题:【av68676164(p31-p32)】Windows和Linux同步机制
文章链接:http://soscw.com/index.php/essay/63717.html