DLL中的函数内,CMutex锁定失效

angkorcn 2006-02-24 02:09:23
在DLL工程内部CMutex锁定有效
外部调用DLL的工程CMutex锁定失效

对调用DLL的工程来说,锁不起作用

代码如下:
///////////////////////////////////////

//XXXX.h

CMutex m_mutex;

//XXXX.cpp

HRESULT ToSync()
{
CSingleLock Lock(&m_CmdMutex);
if(!Lock.Lock(5000)){ ASSERT(false); return ERR_XXXX; }
//do something
if(!Lock.Unlock()){ ASSERT(false); return ERR_XXXX; }
return S_OK;
}
...全文
149 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
angkorcn 2006-02-24
  • 打赏
  • 举报
回复
很明显的错误。以后写程序多看看msdn
/////////////////////////
不好意思,你的方案同我的是一样的,这个写法我已经试过的
我的写法是大多数人的写法吧,我是随德国人写的

楼上的兄弟太拘泥于MSDN了
w0017 2006-02-24
  • 打赏
  • 举报
回复
很明显的错误。以后写程序多看看msdn

Example

// m_CritSection is a data member (of type CCriticalSection)
// of an existing class that implements the resource being shared.

// Relate the synchronization object (m_CritSection) with
// our CSingleLock object.
CSingleLock singleLock(&m_CritSection);
singleLock.Lock(); // Attempt to lock the shared resource
if (singleLock.IsLocked()) // Resource has been locked
{
//...use the shared resource...

// Now that we are finished,
// unlock the resource for others.
singleLock.Unlock();
}

lzzqqq 2006-02-24
  • 打赏
  • 举报
回复
不会吧?dll与exe一样的啊.是不是你调用dll的时候 Mutex变量没初始化啊?
angkorcn 2006-02-24
  • 打赏
  • 举报
回复
dll或者exe 都动态链接到多线程库的。
angkorcn 2006-02-24
  • 打赏
  • 举报
回复
我说清楚一点,不好意思:

//XXXX.h
class XXXX
{
private:
CMutex m_mutex;
}

//XXXX.cpp

HRESULT XXXX::ToSync()
{
CSingleLock Lock(&m_CmdMutex);
if(!Lock.Lock(5000)){ ASSERT(false); return ERR_XXXX; }
//do something
if(!Lock.Unlock()){ ASSERT(false); return ERR_XXXX; }
return S_OK;
}
angkorcn 2006-02-24
  • 打赏
  • 举报
回复
你理解错了

其实在DLL所在工程里同步是没有问题的(我有监护线程)

但是用的此DLL的工程出现 重入 现象!!

注意这里说两个工程的差异问题!!!

我觉得代码是没有问题的
mythay 2006-02-24
  • 打赏
  • 举报
回复
首先,你的CMutex m_mutex是不是一个全局变量,在exe和dll中都能使用。
如果是这样的话,首先检查你的程序链接方式,是不是dll或者exe有一个没有动态链接到多线程库。
striking 2006-02-24
  • 打赏
  • 举报
回复
还有
if(!Lock.Lock(5000)) 你的意思是锁定5秒, 5秒后退出锁定??
striking 2006-02-24
  • 打赏
  • 举报
回复
Mutex 和CRITICAL_SECTION 差不多

所谓CRITICAL_SECTION 是用来处理"一份被共享的资源", 如一段内存, 一个数据结构,一个文件等.也就是资源每一次,同一个时间只能被一个线程处理.

简单的讲, CRITICAL_SECTION 用来保护资源, 当一个线程对某资源A写的时候, 避免别的线程对资源A进行任何操作. 就是保护数据的一致性.

你刚刚用的在同一线程. 没有用...

多线程才使用..

15,472

社区成员

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

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