zoukankan      html  css  js  c++  java
  • Windows环境下多线程编程原理与应用读书笔记(5)————互斥及其应用

    <一>互斥的同步机制

           思想:当一个线程获得互斥量了后,其他所有要获取同一个互斥量的线程都处于阻塞状态,直到第一个线程释放互斥量为止。

    设想几个线程竞争同一个互斥量,其中一个线程获得了互斥量。其他线程将被阻塞,进入睡眠状态。处于睡眠状态的线程几乎不消耗资源,这就有利于提高系统的运行效率。当占有互斥量的线程释放互斥量时,等待该互斥量的所有线程都将被“唤醒”,这些线程一起竞争该互斥量。

    <二>Win32 API中的互斥函数

    函数名 作用
    CreateMutex 创建一个新的互斥量
    OpenMutex 打开一个已有的互斥量
    ReleaseMutex 释放互斥量
    WaitForSingleObject 等待某个事件

     以上的各个函数的具体用法参看Win32 API手册。在此只是列举各函数的一点点注意事项。

    1. CreateMutex函数返回的句柄对互斥量有完全的控制权;
    2. 多个线程可以同时调用CreateMutex函数来创建同名的互斥对象。但实际上只有第一个调用CreateMutex的线程真正创建了互斥对象,其他线程都只是打开已有的互斥对象句柄。
    3. 调用ReleaseMutex函数的线程,如果它没有拥有该互斥对象,那么调用ReleaseMutex失败;

    如下例子:

    #include <iostream>
    #include <windows.h>
    #include "process.h"
    using namespace std;
    
    HANDLE hMutex;
    
    int a[5],i;
    
    void Thread()
    {
    	int num=0;
    	while(true)
    	{
    		WaitForSingleObject(hMutex,INFINITE);
    		for (i=0;i<5;i++)
    		{
    			a[i]=num;
    		}
    		ReleaseMutex(hMutex);
    		num++;
    	}
    }
    
    int main()
    {
    	hMutex=CreateMutex(NULL,FALSE,NULL);
    	//_beginthread(Thread,0,NULL);
    	//_beginthread(Thread,0,NULL);
    	CreateThread(0,0,(LPTHREAD_START_ROUTINE)Thread,0,0,0);
    	while(true)
    	{
    		WaitForSingleObject(hMutex,INFINITE);
    		for (i=0;i<5;i++)
    		{
    			cout<<a[i]<<"  ";
    		}
    		ReleaseMutex(hMutex);
    		
    	} 
    	CloseHandle(hMutex);
    	return 0;
    }
    

      

  • 相关阅读:
    Buffer cache spillover: only buffers
    11g中如何禁用自动统计信息收集作业
    OTN中文技术论坛清净的ORACLE讨论之地
    关闭磁盘自动运行
    #error
    在VC++中实现无标题栏对话框的拖动
    string,CString,char*之间的转化
    关于注册表
    #pragma once
    extern "C"用法详解
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/3384401.html
Copyright © 2011-2022 走看看