读写者问题?--比较难

bluesoalr 2004-03-19 12:39:37
TRACE("%d err: %d\n", m_uLocalPort, GetLastError() )打印的错误代码是288
error Lookup的解释为:
企图释放并非呼叫方所拥有的多用户终端运行程序。

读者的代码:
int CUdpSendSocket::WriteData()
{
WSABUF * p;
m_hWriteMutex = OpenMutex( MUTEX_ALL_ACCESS, FALSE, g_lpszWriteMutexName );
m_hReadMutex = OpenMutex( MUTEX_ALL_ACCESS, FALSE, g_lpszReadMutexName );
ASSERT( NULL != m_hWriteMutex );
ASSERT( NULL != m_hReadMutex );
while ( 1 )
{
p = m_pQueue->GetQueueObject(); //return after get an obj

WaitForSingleObject( &m_hReadMapMutex, INFINITE );
if( g_lReadCount == 0 )
{
WaitForSingleObject( &m_hWriteMutex, INFINITE);
}
g_lReadCount++;
ReleaseMutex(m_hReadMutex);

TRACE("%d err: %d\n", m_uLocalPort, GetLastError() );
//send to network

WaitForSingleObject( &m_hReadMutex, INFINITE);
CUtility::g_lReadCount--;
if( g_lReadCount == 0 )
{
ReleaseMutex(m_hWriteMutex);
}
ReleaseMutex(m_hReadMutex);

free(p->buf);
free(p);
}//while (1)
return 0;
}
...全文
67 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
enoloo 2004-03-20
  • 打赏
  • 举报
回复
将m_writemutex改成semaphore试试
enoloo 2004-03-19
  • 打赏
  • 举报
回复
同意xstring(麻雀),,句柄用错了/

读数据的逻辑是对的。写数据的呢??
快乐鹦鹉 2004-03-19
  • 打赏
  • 举报
回复
看不明白,帮你up
xstring 2004-03-19
  • 打赏
  • 举报
回复
???

你的WaitForSingleObject中的句柄前为什么都加取地址符&

这样Wait能成功么?

太粗心了!!
bluesoalr 2004-03-19
  • 打赏
  • 举报
回复
所有代码:(程序改了一下,但问题相同)
说明:CUtility::g_hXXXMutex为静态变量,程序初始化时候创建相应的Mutex;

读者:
while ( 1 )
{
p = m_pQueue->GetQueueObject(); //return after get an obj

WaitForSingleObject( CUtility::g_hReadMapMutex, INFINITE );
if( CUtility::g_lReadCount == 0 )
{
WaitForSingleObject(CUtility::g_hWriteMapMutex, INFINITE);
}
InterlockedIncrement( &(CUtility::g_lReadCount) );
ReleaseMutex(CUtility::g_hReadMapMutex);

.........//do something;

WaitForSingleObject(CUtility::g_hReadMapMutex, INFINITE);
InterlockedDecrement( &(CUtility::g_lReadCount)) ;
if( CUtility::g_lReadCount == 0)
{
ReleaseMutex(CUtility::g_hWriteMapMutex);
}
ReleaseMutex(CUtility::g_hReadMapMutex);

}//while (1)
**************************
写者
while (TRUE)
{
WaitForSingleObject( CUtility::g_hEventUpdateClientMap, INFINITE);
WaitForSingleObject(CUtility::g_hWriteMapMutex, INFINITE);

.........//do something;

ReleaseMutex(CUtility::g_hWriteMapMutex);

}
enoloo 2004-03-19
  • 打赏
  • 举报
回复
WaitForSingleObject( &m_hReadMapMutex, INFINITE );
if( g_lReadCount == 0 )
{
WaitForSingleObject( &m_hWriteMutex, INFINITE);
}
g_lReadCount++;
ReleaseMutex(m_hReadMutex);
我开始也没大注意。m_hReadMapMutex从哪里来的??是m_hReadMutex把??)
还有,如果方便的话,把write部分也贴出来。
xstring 2004-03-19
  • 打赏
  • 举报
回复

WaitForSingleObject( &m_hReadMapMutex, INFINITE );
if( g_lReadCount == 0 )
{
WaitForSingleObject( &m_hWriteMutex, INFINITE);
}
g_lReadCount++;
ReleaseMutex(m_hReadMutex);

Wait的是m_hReadMapMutex,Release的怎么是m_hReadMutex?
szclm 2004-03-19
  • 打赏
  • 举报
回复
288 Attempt to release mutex not owned by caller. ERROR_NOT_OWNER
尝试去释放一个不是自己的互斥量

错误应该是这句吧:ReleaseMutex(m_hReadMutex);
薛定谔之死猫 2004-03-19
  • 打赏
  • 举报
回复
gz
bluesoalr 2004-03-19
  • 打赏
  • 举报
回复
WaitForSingleObject中的句柄前为什么都加取地址符&
是从windows高级编程(Jefferey Richter)上抄的,我本来没有加&的

写数据的肯定对。写数据没用到ReadMapMutex
读数据出现过WaitForSingleObject( m_hReadMapMutex, INFINITE )也不返回的情况



GameWeaverDummy 2004-03-19
  • 打赏
  • 举报
回复

15,471

社区成员

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

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