有关于mutex的问题

comman_wang 2003-11-07 04:26:37
在程序中要实现对某个文件的互斥访问,我采用了信号量同步的方法,但没有成功。

在create函数里初始化
HLogMutex=::CreateMutex(NULL,FALSE,"logmutex");

在访问函数中
::WaitForSingleObject(HLogMutex,INFINITE);
访问操作
::ReleaseMutex(HLogMutex);

这样方法正确吗?望高手指点。
...全文
59 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
comman_wang 2003-11-11
  • 打赏
  • 举报
回复
关于mutex的问题仍然没有解决,很是疑惑。不知是mutex还是文件操作函数CreateFile有问题,望高手分析一下。具体代码如下:(主要实现写文件功能,被多个线程调用,封装成一个函数)

::WaitForSingleObject(HLogMutex,INFINITE);
h_logfile=CreateFile(
"..\\logdata\\logdata.com",
GENERIC_WRITE,
0,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE)NULL
);
dwError = GetLastError();
if(INVALID_HANDLE_VALUE==h_logfile)
{
CString str;
str.Format("log handle is invalid %d",dwError);
AfxMessageBox(str);
}

……

DWORD bResult=WriteFile( h_logfile,
log_str,
logstr_len,
&NumberOfBytesWrite,
NULL
);


if(h_logfile!=INVALID_HANDLE_VALUE)
{
DWORD CHerr=CloseHandle(h_logfile);
if(0==CHerr)
{
dwError = GetLastError();
CString str;
str.Format("close handle is fail. the errcode is %d",dwError);
AfxMessageBox(str);
}


}
::ReleaseMutex(HLogMutex);

长期运行后,会发生问题“log handle is invalid 32”,即文件访问冲突(正被另一进程使用),但CloseHandle没有发生错误(应该都成功了)。访问冲突的具体原因是什么呢?疑惑ing……
tomfool 2003-11-08
  • 打赏
  • 举报
回复
这个问题我刚问过,请看下面的帖子,
http://expert.csdn.net/Expert/topic/2427/2427683.xml?temp=.2488825
dawndu 2003-11-08
  • 打赏
  • 举报
回复
ownership只有一个线程会得到,就是调用WaitForSingleObject成功的那个,跟创建它的线程没有任何关系
得到ownership的那个线程无论WaitForSingleObject多少次都不会被锁住了,这个跟信号量是不一样的
vcforever 2003-11-07
  • 打赏
  • 举报
回复
你既然要用Mutex来进行线程同步,为什么还要多次Create他呢?
comman_wang 2003-11-07
  • 打赏
  • 举报
回复
但是有的时候会发生错误,很是疑惑。
CreateMutex初始化多次时,记数会被累加多次吗?
MSDN只说WaitForSingleObject函数有效时,该线程取得该Mutex的ownership,才能执行相关的任务。CreateMutex初始化多次后,会不会多个线程都取得该Mutex的ownership?
vcforever 2003-11-07
  • 打赏
  • 举报
回复
正确!
放手干吧!
成功!

15,471

社区成员

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

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