【多线程之二】CreateMutex()互斥体

某修学习多线程第二个知识点,这里再做个笔记。

Mutex控制互斥体的一些函数的使用:
CreateMutex、ReleaseMutex、WaitForSingleObject。

CreateMutex()

功能:创建一个互斥体

VC声明

HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针
BOOLbInitialOwner, // 初始化互斥对象的所有者
LPCTSTRlpName // 指向互斥对象名的指针
);

显然看不懂,简单化一下:
返回值:一个句柄~
第一个参数:先不管!默认!
第二个参数:
TRUE:信号已被当前线程获得,没有释放之前其他线程不能获得。
FLASE:自由争取。
第三个参数:互斥体名称,大家可以自由取~(当然这里,绝对绝对会出现问题的)········

ReleaseMutex()

功能:释放一个互斥体

VC声明

BOOL WIANPI ReleaseMutex(
HANDLE hMutex
);

这次的声明倒是简单很多;
返回值:bool类型,成功失败不多说;
参数一:句柄

WaitForSingleObject()

功能:等待

VC声明

DWORD WaitForSingleObject(

HANDLE hHandle,
DWORD dwMilliseconds
);

第一个参数:文件句柄
第二个参数:等待时间(INFINITE,无限等待)

多线程进程的例子二

#include 
#include 

HANDLE hmutext;

DWORD WINAPI add(LPVOID Param)
{
    while (1)
    {
        WaitForSingleObject(hmutext, INFINITE);
        *(int*)Param -= 3;
        std::cout << *(int*)Param << std::endl;
        Sleep(1000);
        ReleaseMutex(hmutext);
    }
    return 0;
}

int main(void)
{
    int a = 10;
    HANDLE hThread = CreateThread(NULL, 0, add, &a, 0, NULL);
    hmutext = CreateMutex(NULL, false, L"huchiti");
    CloseHandle(hThread);

    while (1)
    {
        WaitForSingleObject(hmutext, INFINITE);
        a += 5;
        std::cout << a << std::endl;
        Sleep(2000);
        ReleaseMutex(hmutext);
    }
    return 0;
}

这个代码呢,就会严格执行a先加5再减去3的顺序运行了,这就是互斥体~
但是, hmutext = CreateMutex(NULL, false, L”huchiti”)这里,false的机制决定了,一开始的顺序是由两个线程抢占的,到底是先+5,还是先-3,实在不好说清楚。如果现在需要先-3呢?也就是先运行子进程呢?

这个问题,再做研究吧。。。

你可能感兴趣的:(C++)