在动态链接库中使用多线程的问题?

lifeforu 2006-06-12 09:59:03
将一部分使用了MFC代码的类库做成DLL
1 使用CWinThread thr = AfxBeginThread(...);造成死锁,追入源码发现WaitForSingleObject(startup.event)的时候死锁,不知何故;
2 使用CSingleLock sl(&m_criticalsection);ASSERT(CCriticalSection->IsKindOf(CSyncObject))失败,奇怪;

如果全改成SDK代码量很大,所以问一问有谁做过类似的,或是知道如何解决的

谢谢
...全文
883 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdjnju 2006-06-30
  • 打赏
  • 举报
回复
用WIN32吧,MFC太麻烦,容易出错
lifeforu 2006-06-28
  • 打赏
  • 举报
回复
接上,问题依然没有解决,又发现新的问题。
在网上找了一些,居然没有发现和我同样的问题:
前面我所说的在非动态库程序中使用这些代码可正常运行,没想到在一个新的程序中使用的时候又出现了问题,问题在于:
static CCriticalSection m_cs;//这样一个静态成员变量就好像没有被初始化一样,或者说是::initializeCriticalsection()这个函数在初始化CCriticalSection的成员变量的时候失败,具体表现在m_cs.DebugInfo == 0;此时使用CSingleLock失败。

不知道何解?居然在网上没找到一个同样的错误,看来非得弃用这些?
KeSummer 2006-06-18
  • 打赏
  • 举报
回复
楼主加上这句看看AFX_MANAGE_STATE(AfxGetStaticModuleState());
void init()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

CWinThread thr = AfxBeginThread(...);
}

-----------------------------------------------
以上意见毫无根据(^-^)
lifeforu 2006-06-18
  • 打赏
  • 举报
回复
我很奇怪为什么一个类的static CMutex m_mutex;在被CSingleLock 作为参数构造时居然其内核对像m_pObject == 0;这是不应该出现的问题啊
shicheng521 2006-06-15
  • 打赏
  • 举报
回复
在《windows核心编程》中的动态库部分,说了和这个类似的问题。
lifeforu 2006-06-14
  • 打赏
  • 举报
回复
有没有人解决这样的问题了
shicheng521 2006-06-14
  • 打赏
  • 举报
回复
大家都说说,我也遇到了这个问题,
没有办法,只能导出初始化的函数,然后在使用动态库的程序中调用这个初始化函数
lifeforu 2006-06-13
  • 打赏
  • 举报
回复
to laiyiling(【陌生人.MVP】) :
我也尝试改成HANDLE = CreateThread,但是在CSingleLock(static CCriticalSection pointer)的时候不知道怎么做了

to jacklzw88(不可爱咯) :
你的意思是在客户端调用AfxOleInit(); ?我试了一下,并没有改观

TO striking(硬撑者):
CCriticalSection 改用指针,然后在ThreadFunction里面new , 线程结束delete

作为一个static指针怎么处理
zdjnju 2006-06-13
  • 打赏
  • 举报
回复
我对MFC不熟,瞎说几句吧~

第一个问题

先说点:
a. DllMain(...)是不可重入的,同时只能有一个线程在DllMain(...)中;
b. 当新线程启动时,会首先使用DLL_THREAD_ATTACH参数调用DllMain(...),然后才执行线程入口函数;
c. 我估计,AfxBeginThread(...)中使用WaitForSingleObject(...)来等待新线程从DllMain(...)返回;

可见,如果在DllMain中调用AfxBeginThread(...)的话,就势必造成了一个死锁条件。

所以,如果非要在DllMain中创建线程的话,应该使用_beginthreadex(...)这个C函数。
另注意,决不要在C/C++代码中调用CreateThread(...)。

jacklzw88 2006-06-13
  • 打赏
  • 举报
回复
AfxEnableControlContainer();
AfxOleInit();
striking 2006-06-13
  • 打赏
  • 举报
回复
CCriticalSection 改用指针,然后在ThreadFunction里面new , 线程结束delete.

Kudeet 2006-06-13
  • 打赏
  • 举报
回复
AfxBeginThread和DLLMain用了同一个事件, 不能用AfxBeginThread,用CreateThread试试



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_Can_an_MFC_DLL_create_multiple_threads.3f.asp
Can an MFC DLL create multiple threads?
lifeforu 2006-06-12
  • 打赏
  • 举报
回复
热烈祝贺澳大利亚3:1胜小日本.

可以确定是动态库的原因,在非动态库的情况下正常通过.

代码实在太长,不方便贴出,所说的第一个问题伪代码:
CCriticalSection CThread::m_threadCS;//static
CThread::CThread()
{
this->m_pThread = AfxBeginThread(ThreadFunction,this);//此句死锁...
}
UINT CThread::ThreadFunction(LPVOID pParam)//static
{
...
}
void CThread::test()
{
CSingleLock ls(&m_threadCS);//此句ASSERT失败
}
C20062222 2006-06-12
  • 打赏
  • 举报
回复
1.你能确认是动态库的原因吗?在非动态库的情况下试过吗?
2.把代码贴出来,好查问题
DentistryDoctor 2006-06-12
  • 打赏
  • 举报
回复
得看具体的代码了

15,471

社区成员

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

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