为什么互斥体不能返回????????急~~~~~~~~~~~~

taoyi 2005-07-27 09:51:11
代码类似如下结构:

MUTEX m_hMutex;

public void DoWork()
{
m_hMutext = CreateMutex();
WaitFor.....;
// ..........
ReleaseMutex(m_hMutex);
}

但在运行的过程中发现有些时候ReleaseMutex并没有将其释放,而下一个线程就怎么也进不了代码段了,老是在那里Wait,郁闷死啦~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

高人帮忙~~~~~~~~~~~~~~~~
...全文
93 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
needways 2005-07-27
要看你的 DoWork 执行了几次,如果是每个线程中都执行的话,那 DoWork 就有问题了。
你可以将 m_hMutex = CreateMutex() 放到其他地方(比如说在应用程序启动后就创建好)。

int WinMain(...)
{
...
m_hMutex = CreateMutex();
...
}

void DoWork()
{
WaitForSingleObject(m_hMutex);
...
ReleaseMutex(m_hMutex);
}
  • 打赏
  • 举报
回复
goodboyws 2005-07-27
也许是别的什么地方先产生阻塞呢,根本没到ReleaseMutex那一步呢
  • 打赏
  • 举报
回复
taoyi 2005-07-27
to ForTopLevel: m_hMutex是全局的,并且只有一个地方Create.
to happyparrot: 肯定是执行了的,因为我是写在__finally块里的.
to DentistryDoctor:每次DoWork是就创建一次?,再Release一次,本身就有问题?

为啥本身就有问题呢?望指点~~
  • 打赏
  • 举报
回复
DentistryDoctor 2005-07-27
每次DoWork是就创建一次?,再Release一次,本身就有问题?

在初始化时创建,在反初始化的时候Release?

如果是进程内的话,应该使用临界区,这样可以获得更好的性能。
  • 打赏
  • 举报
回复
快乐鹦鹉 2005-07-27
ReleaseMutex(m_hMutex);
--在此行加断点,看看是否执行到了。另外看看句柄是否正确
  • 打赏
  • 举报
回复
ForTopLevel 2005-07-27
m_hMutext = CreateMutex()在函数外写,如果是多线程共享的话,写成全局的。
  • 打赏
  • 举报
回复
DentistryDoctor 2005-07-27
考虑使用CMutex+CSingleLock
  • 打赏
  • 举报
回复
发帖
网络编程

1.8w+

社区成员

VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
帖子事件
创建了帖子
2005-07-27 09:51
社区公告
暂无公告