您的位置:首页 > 其它

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

2018-02-20 16:24 441 查看
互斥量接口:

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中的运行结果如下:



可见线程同步问题没有得到好的解决。

互斥量是内核对象,它与关键段都有“线程所有权”所以不能用于线程的同步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐