互斥及其应用

    xiaoxiao2021-12-14  22

    互斥量和临界段的区别在于:临界段只能用于单个进程中的多个线程的同步,互斥量则可用于多个进程中线程的同步;

    一个有效的同步算法满足如下: 1.不存在两个线程同时访问临界区的情况; 2.同步方法对CPU速度和处理器数目没有任何假设; 3.运行于临界区外的线程不能阻塞其他线程; 4.不能有因要进入临界区而无限等待的线程;

    .互斥的同步机制:当一个线程获得互斥量后,其他所有要获取同一互斥量的线程都处于阻塞状态,直到第一个线程释放互斥量为止;

    CreateMutex():创建一个互斥量; OpenMutex():打开一个已有的互斥量; ReleaseMutex():释放对互斥量的所有权; WaitforSingleObject():等待某个事件;

    互斥对象是同步对象的一种,当没有任何线程拥有该对象时,系统将互斥对象设为有信号状态,一旦某个线程得到了该对象,系统设为无信号对象;至多有一个线程可拥有该互斥对象;

    #include <iostream> #include <Windows.h> using namespace std; DWORD WINAPI Fun1Proc(LPVOID lp1); DWORD WINAPI Fun2Proc(LPVOID lp2); int tickets=100; int index=0; HANDLE hMutex; int main() { HANDLE hThread1,hThread2; hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); hMutex=CreateMutex(NULL,FALSE,NULL); //TRUE代表主线程拥有该互斥对象,但是主线程没有释放,互斥对象谁拥有,使用完后的释放 //FALSE代表当前所处的线程并没有拥有该互斥对象 Sleep(4000); } DWORD WINAPI Fun1Proc(LPVOID lp1) { while(true) { WaitForSingleObject(hMutex,INFINITE);//获取Mutex的所有权 if(tickets>0) { cout<<"t1:"<<tickets--<<endl; } else break; ReleaseMutex(hMutex); } return 0; } DWORD WINAPI Fun2Proc(LPVOID lp2) { while(true) { WaitForSingleObject(hMutex,INFINITE); if(tickets>0) { cout<<"t2:"<<tickets--<<endl; } else break; ReleaseMutex(hMutex); } return 0; }

    http://blog.csdn.net/zhongchengli/article/details/7652403

    转载请注明原文地址: https://ju.6miu.com/read-971137.html

    最新回复(0)