Mutex的问题,HANDLE不能用指针传入

wtogether 2005-07-08 09:12:40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

unsigned int i = 0;
int y = 0;

void mutex_lock(HANDLE *this)
{
char buf[32] = {0};
sprintf(buf, "mutex_%.8X", y++);
*this = CreateMutex(NULL, TRUE, buf);
printf("mutex_lock(%d, %s) = %d\r\n", *this, buf, GetLastError());
WaitForSingleObject(*this, INFINITE);
}

void mutex_unlock(HANDLE *this)
{
ReleaseMutex(*this);
printf("mutex_unlock(%d, %ld)\r\n", *this, GetLastError());//这里出错了,都是183L,即ERROR_ALREADY_EXISTS
CloseHandle(*this);
printf("mutex_unlock(%d, %ld)\r\n", *this, GetLastError());
*this = NULL;
printf("mutex_unlock(%d, %ld)\r\n", *this, GetLastError());
}

void xtracer(const char *fmt, ...)
{
FILE *fp = fopen("tracer.txt", "a");
va_list app;
va_start(app, fmt);
vfprintf(fp, fmt, app);
va_end(app);
fclose(fp);
}

void ttt(int x)
{
HANDLE mutex = NULL;
mutex_lock(&mutex);
while (i<0xFF)
xtracer("%d, hello world, %u\r\n", x, i++);
mutex_unlock(&mutex);
}

int main(int argc, char *argv[])
{
HANDLE handle[2] = {0};
handle[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ttt, (void *)1, 0, NULL);
handle[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ttt, (void *)2, 0, NULL);
WaitForSingleObject(handle[0], INFINITE);
WaitForSingleObject(handle[1], INFINITE);
return(0);
}

控制台输出就是:
mutex_lock(2008, mutex_00000000) = 0
mutex_lock(2004, mutex_00000001) = 0
mutex_unlock(2004, 183)
mutex_unlock(2004, 183)
mutex_unlock(0, 183)
mutex_unlock(2008, 183)
mutex_unlock(2008, 183)
mutex_unlock(0, 183)

看得出ReleaseMutex和CloseHandle都失效了,为什么呢?
如果把HANDLE做为一个结构的成员,那么用结构指针在mutex_lock和mutex_unlock之间赋值和传值就不会有这个错误
HANDLE原型是void *,是不是用void **在函数之间赋值和传值是不正确的操作?
...全文
141 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wtogether 2005-07-08
  • 打赏
  • 举报
回复
就因为不是同一个mutex,更应该CreateMutex并且ReleaseMutex成功啊
WaitForSingleObject(mutex, INFINITE);

ReleaseMutex(mutex);
这必须配套的吧

我刚才继续测试了一下,把mutex_lock函数里的
*this = CreateMutex(NULL, TRUE, buf);
改成
*this = CreateMutex(NULL, TRUE, NULL);
或者buf用同名mutex,或者第二个参数用FALSE
也是一样的结果,ReleaseMutex和CloseHandle都返回ERROR_ALREADY_EXISTS
qrlvls 2005-07-08
  • 打赏
  • 举报
回复
也就是说你函数中的 mutex_lock 根本就不会产生互斥
qrlvls 2005-07-08
  • 打赏
  • 举报
回复
HANDLE mutex = NULL;
mutex_lock(&mutex);
while (i<0xFF)
xtracer("%d, hello world, %u\r\n", x, i++);
mutex_unlock(&mutex);
你这个是想做什么?mutex 被创建了两份,两个线程中的 mutex 压根就不是同一个
qrlvls 2005-07-08
  • 打赏
  • 举报
回复
这样也行,线程函数原型:
DWORD WINAPI ThreadFunc( LPVOID lpParam );

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧