怎么还会出现线程不安全?

sms88 2009-09-12 10:10:19
DLL创建的多线程里再调用另外一DLL导出的函数,在调用这个函数时我已经加了互斥量。

BOOL WINAPI DllMain(
HANDLE hinstDLL,
DWORD dwReason,
LPVOID lpvReserved)
{
if( dwReason ==DLL_PROCESS_ATTACH)
{
//连接mysql数据库
}
}

DATA_API int Get_Data(int number , int& grade , int& age , char *pName )
{
string strname ;
//从mysql数据库中读取关于number为关键字的信息赋给grade ,age ,strname
//再将strname的值拷贝到pName
OutputDebugString( strname.c_str() ) ; //有输出信息,grade,age也有非0值的
strcpy(pName , strname.c_str() ) ;
return 0;
}





DLL创建的多线程里会调用studentinfo ,studentinfo再调用上面这个DLL的导出函数

void studentinfo( )
{
int number = 025020032 ;
int grade = 0 ; //定义
int age = 0 ; //定义
char szName[128] ; //定义
memset( szName , 0 , sizeof(szName)) ;
WaitForSingleObject(hDataMutex ,INFINITE ) ; //互斥
if( pGet_Data!= NULL)
{
int iresult = pGet_Data(number , grade , age , szName) ;
char szdebuginfo[256] ;
memset( szdebuginfo , 0 , sizeof(szdebuginfo)) ;
sprintf( szdebuginfo , "grade=%d ,age=%d , name=%s" , grade ,age ,szName) ;
OutputDebugString( szdebuginfo ) ;
}
ReleaseMutex( hDataMutex) ;
}


我从输出信息来看OutputDebugString( strname.c_str() ) 每次都能输出内容,可偶尔几次OutputDebugString( szdebuginfo ) ;的输出的竟是:
grade=0 ,age=0,szname=
DLL里都没带值出来
...全文
151 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
aizibion 2009-09-13
  • 打赏
  • 举报
回复
OutputDebugString( strname.c_str() ) ; //有输出信息,grade,age也有非0值的
strcpy(pName , strname.c_str() ) ;

如果这里从OutputDebugString出来得strname有值得话,可以想象OutputDebugString中对strname做了改变,那末

OutputDebugString( szdebuginfo ) ;
后,szdebuginfo 被改变也就不足为奇了
mengde007 2009-09-13
  • 打赏
  • 举报
回复
dll里面不要创建线程;熟读windows程序设计第五版dll这一块就知道了;
oLINo 2009-09-13
  • 打赏
  • 举报
回复
那是因为你操作数据库的问题吧

操作完数据库要加上判断,是否返回正确记录
jackyjkchen 2009-09-12
  • 打赏
  • 举报
回复
对于线程不多的情况,我一般手动使用事件量控制进程,程序很清晰,没出现过这种情况
Erorr 2009-09-12
  • 打赏
  • 举报
回复
也许不是线程不安全,是不是DLL调用失败了,提前返回,没有打出OutputDebugString( strname.c_str() )这个Log就退出了。

64,689

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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