天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理VIP详情进入 ←←←←←←←←←←←←
1 x64CE与x64dbg入门基础教程 7课 已完结 2 x64汇编语言基础教程 16课 已完结 3 x64辅助入门基础教程 9课 已完结 4 C++x64内存辅助实战技术教程 149课 已完结
5 C++x64内存检测与过检测技术教程 10课 已完结 6 C+x64二叉树分析遍历与LUA自动登陆教程 19课已完结 7 C++BT功能原理与x64实战教程 29课 已完结 8 C+FPS框透视与自瞄x64实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? VIP会员办理QQ: 89986068   
【请先加好友,然后到好友列表双击联系客服办理,不然可能无法接受到信息。】
27 加入2000人交流群637034024 3 28 免责声明?
查看: 1296|回复: 0

Mutex与Event控制互斥事件的使用详解

[复制链接]

9

主题

0

回帖

11

积分

编程入门

Rank: 1

天马币
18
发表于 2024-3-1 14:09:34 | 显示全部楼层 |阅读模式
 最近写一程序,误用了Mutex的功能,错把Mutex当Event用了。

【Mutex】

  使用Mutex的主要函数:CreateMutex、ReleaseMutex、OpenMutex、WaitForSingleObject、WaitForMultipleObjects。

  CreateMutex:其中第二个参数是表示当前线程拥有权。
    TRUE:创建线程获得初始所有权的互斥对象(即信号已被当前线程获得,没有释放前其它线程不能获得。如果当前线程调用了WaitForSingleObject函数,则释放次数等于调用次数加1)。
    FALSE:创建线程没有获得互斥对象的所有权。也就是自由争取,看谁先Wait到。
  不管怎么样,MUtex的释放规则是:谁拥有谁释放,还有在线程结束时,线程所获得的Mutex自动释放;当然还可以使用命名Mutex做唯一性验证,这个在整个windows生存期下有效。

【Event】

  与Mutex不一样,Event是任何时候都是可以操作的,而且没有同调用多次WaitForSingleObject和同时释放多次一说。它的主要操作函数有:CreateEvent、SetEvent、WaitForSingleObject。

  CreateEvent参数说明。
    第二个参数表示调用WaitForSingleObject后手动(TRUE)/自动(FALSE)为无信号状态。
    第三个参数表示初始状态为有(TRUE)/无(FALSE)信号。
  Event的获得是通过一个队列去排队获得的,SetEvent没有限制使用,在任何可以调用的地方都可以调用。

Mutex,的互斥是以线程为基本单位,而Event是以代码段为基本单位。所以在两者的使用上有着不同的功能用途。


#include "stdafx.h"
#include "iostream"
#include "windows.h"

using namespace std;

DWORD WINAPI ThreadProc1(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);
HANDLE hEvent = NULL;
HANDLE hThread1 = NULL;
HANDLE hThread2 = NULL;
int main(int argc,char *args[])
{
    hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); // 使用 *重置为无信号状态,初始化时*信号状态
//    hEvent = CreateMutex(NULL, FALSE, NULL); // FALSE: 创建线程没有获得互斥对象的所有权 TRUE: 创建线程获得初始所有权的互斥对象
    hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc1,NULL,0,NULL);
    Sleep(200);
    hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc2,NULL,0,NULL);
    Sleep(200);
    if (NULL == hThread1 || NULL == hThread2)
    {
        cout <<"create thread fail!";
    }//DWORD dReturn = WaitForSingleObject(hEvent,INFINITE);
    //cout<< dReturn << endl;
    //ReleaseMutex(hEvent);
    //ReleaseMutex(hEvent);
    while(1){

        Sleep(100);
    //    ReleaseMutex(hEvent);
        SetEvent(hEvent);
    }
    return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
    cout <<"in thread1@!"<<endl;
    DWORD dReturn = WaitForSingleObject(hEvent,INFINITE);
    if (WAIT_OBJECT_0 == dReturn)
    {
        cout <<"thread1 signaled ! "<<endl;
    }
   
    dReturn = WaitForSingleObject(hEvent,INFINITE);
    if (WAIT_OBJECT_0 == dReturn)
    {
        cout <<"thread1 signaled*&* ! "<<endl;
    }

    cout <<"in thread1 --signal"<<endl;
    //SetEvent(hEvent);

    //ReleaseMutex(hEvent);
    //ReleaseMutex(hEvent);
    while(1){
        Sleep(100);
    }
    return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
    cout <<"in thread2@!"<<endl;
    DWORD dReturn = WaitForSingleObject(hEvent,INFINITE);
    if (WAIT_OBJECT_0 == dReturn)
    {
        cout <<"thread2 signaled ! "<<endl;
    }
    cout <<"in thread2--signal"<<endl;
    //SetEvent(hEvent);
    //SetEvent(hEvent);
    //ReleaseMutex(hEvent);
    while(1){
        Sleep(100);
    }
    return 0;
}

//int _tmain(int argc, _TCHAR* argv[])
//{
//
////    HANDLE m_hMutex = CreateEvent(NULL,FALSE,TRUE,NULL);// 检查错误代码
//    HANDLE m_hMutex = CreateMutex(NULL, TRUE, NULL);
//    if(m_hMutex == NULL)
//    {
//        printf("create no!\n");
//        return -1;
//    }
//
//    printf("create yes!\n");
//    WaitForSingleObject(m_hMutex, INFINITE);
//    printf("wait yes\n");
//
//    //SetEvent(m_hMutex);
//    //SetEvent(m_hMutex);
//    //SetEvent(m_hMutex);
//
//    //ReleaseMutex(m_hMutex);
//    //ReleaseMutex(m_hMutex);
//    //ReleaseMutex(m_hMutex);
//
//    WaitForSingleObject(m_hMutex, INFINITE);
//    printf("wait yes 2\n");
//    WaitForSingleObject(m_hMutex, INFINITE);
//    printf("wait yes 3\n");
//    WaitForSingleObject(m_hMutex, INFINITE);
//    printf("wait yes 4\n");
//    WaitForSingleObject(m_hMutex, INFINITE);
//    printf("wait yes 5\n");
//    WaitForSingleObject(m_hMutex, INFINITE);
//    printf("wait yes 6\n");
//    WaitForSingleObject(m_hMutex, INFINITE);
//    printf("wait yes 7\n");
//    return 0;
//}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

天马阁|C/C++辅助教程|安卓逆向安全| 论坛导航|免责申明|Archiver||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表天马阁立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2021 All Right Reserved.
快速回复 返回顶部 返回列表