Windows线程(七)使用互斥量无法解决线程同步问题

版权声明:本文为博主原创文章,转载请注明原创链接! https://blog.csdn.net/qq_34706280/article/details/79340081

互斥量接口:

1.创建互斥量:
HANDLE CreateMutex
(
    LPSECURITY_ATTRIBUTES lpMutexAttributes,//安全控制,一般为NULL
    BOOL bInitialOwner,                     //互斥量的初始拥有者
    LPCTSTR lpName                          //互斥量的名称
);
2.打开互斥量
HANDLE OpenMutex
(
    DWORD dwDesireAccess,       //参数访问权限,一般为MUTEX_ALL_ACCESS
    BOOL bInheritHandle,        //互斥量句柄继承性,一般为true
    LPCTSTR lpName              //互斥量名称
);
3.触发互斥量
BOOL ReleaseMutex(HANDLE hMutex);

互斥量测试代码如下所示:


#include <Windows.h>
#include <process.h>
#include <stdio.h>

#define THREAD_NUM 10

unsigned long g_nNum;

HANDLE g_hThreadParameter;
CRITICAL_SECTION g_csThreadCode;

unsigned int __stdcall ThreadFun(void *pM)
{
    int nThreadNum = *(int *)pM;

    ReleaseMutex(g_hThreadParameter);

    Sleep(50);

    EnterCriticalSection(&g_csThreadCode);
    g_nNum++;

    Sleep(0);

    printf("线程编号为%d  全局资源值为%d\n", nThreadNum, g_nNum);

    LeaveCriticalSection(&g_csThreadCode);

    return 0;
}


int main()
{
    HANDLE handle[THREAD_NUM];
    int i = 0;
    g_hThreadParameter = CreateMutex(NULL, 0, NULL);
    InitializeCriticalSection(&g_csThreadCode);

    printf("--------------------线程同步之互斥量--------------------\n");


    while(i < THREAD_NUM)
    {
        handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, &i, 0, NULL);
        WaitForSingleObject(g_hThreadParameter, INFINITE);
        i++;
    }

    WaitForMultipleObjects(THREAD_NUM, handle, 1, INFINITE);

    CloseHandle(g_hThreadParameter);

    DeleteCriticalSection(&g_csThreadCode);

    for(i = 0; i < THREAD_NUM; i++)
    {
        CloseHandle(handle[i]);
    }


    system("pause");

    return 0;
}

以上代码在Visual Studio 2010中的运行结果如下:


这里写图片描述


可见线程同步问题没有得到好的解决。
互斥量是内核对象,它与关键段都有“线程所有权”所以不能用于线程的同步。

猜你喜欢

转载自blog.csdn.net/qq_34706280/article/details/79340081