C++多线程访问同一变量问题

yl358942410 2012-03-15 03:59:45
如下代码为C++DLL中的一段:Data我自认为是个全局变量,在SendMsg最后算是给他赋值。如果最后一行的注释去掉,Data可以弹出正常的值(非空),表明Data确实是有成功赋值的,可是我想在调用这个DLL的C#程序中得到这个Data的值,为什么在GetPackInfo中Data值永远都是空的呢?
也想到可能是多线程的问题,参考过临界区CRITICAL_SECTION ,结果程序直接死掉,然后又试了下Mutex,也是毫无效果,感觉可能不是加锁的问题。
原本是C++白痴,最近项目的关键技术偏偏都是C++,所以希望懂的人能提示一下用什么方法能够达到我要的效果呢,谢谢!

static char Data[65595];
extern "C" __declspec(dllexport) char* GetPackInfo()
{
return Data;
}

void SendMsg(SOCKET s,const char FAR *buf,LPCSTR msg)
{
CLock lock(g_Lock); //加锁
//获取目的IP/Port
struct sockaddr_in sin;
int size;
memset(&sin, 0, sizeof(sin));
size = sizeof(sin);
getpeername(s, (struct sockaddr *)&sin, &size);
char* desAddr=inet_ntoa(sin.sin_addr);
u_short desPort=ntohs(sin.sin_port);
//获取源IP/Port
getsockname(s, (struct sockaddr *)&sin, &size);
char* souAddr=inet_ntoa(sin.sin_addr);
u_short souPort=ntohs(sin.sin_port);
DWORD dwThreadId = ::GetCurrentThreadId();
HWND dstWnd = (HWND)GetProp(GetDesktopWindow(), "HOOK_HWND");
//通知主窗口,进行过滤
SendNotifyMessage(dstWnd, RegisterWindowMessage(msg), dwThreadId, 0);


sprintf(Data,"%s:%d;%s:%d;%s",souAddr,souPort,desAddr,desPort,buf);
//MessageBox(NULL,Data,"Message",MB_OK);
}
...全文
871 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyu500 2012-03-19
  • 打赏
  • 举报
回复
全局变量加static 是为什么?
chenkuan9ck 2012-03-17
  • 打赏
  • 举报
回复
你得设置data的程序和取data的程序是同一个程序?
static 不能再进程间共享 数据变化时会被映射到新的内存里;

#pragma data_seg("SharedDataName")
int test=0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:SharedDataName,RWS ")
这样 test 就可以共享了
yl358942410 2012-03-15
  • 打赏
  • 举报
回复
不会的,因为我已经在DLL中设置了断点,在Data值还没有返回到C#前就已经是空的了。
gold_water 2012-03-15
  • 打赏
  • 举报
回复
可能是数据类型兼容问题。

15,471

社区成员

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

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