多线程内在处理问题
有两个线程A和B.在线程A里new obj,然后把&obj传给线程B,线程B能否正确读出obj的值.如果不行,有什么方法呀! 问题点数:50、回复次数:15Top
1 楼Hendy_So(横笛)回复于 2005-01-25 15:46:22 得分 0
可以。Top
2 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-01-25 15:48:20 得分 10
只要保证变量的生命期,就可以访问Top
3 楼beyound(我知道为什么总让我重新登陆)回复于 2005-01-25 15:55:14 得分 5
oyljerry(☆勇敢的心☆→㊣Project Coding㊣)讲得专业,试试在线程外部声明全局的obj。Top
4 楼skyfine(柳荣宏)回复于 2005-01-25 16:25:53 得分 0
那么接下就是这个问题了
A:
for ( ; ; )
{
pobj = new obj;
...
PostThreadMessage(g_nBid,MY_MSG,(WPARAM)pobj,(LPARAM)sizeof(obj));
}
B:
for ( ; ; )
{
读obj里的内容;
delete (obj*)msg.wParam;
}
这样做行不行呀!是否可以释放?Top
5 楼soullover()回复于 2005-01-25 16:53:19 得分 5
应该没有问题,但是要主要在两个线程退出时注意同步,否则可能发生内存泄漏Top
6 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-01-25 16:54:07 得分 0
最好在一个编译单元中申请空间和释放空间,这才是好的编程规范Top
7 楼skyfine(柳荣宏)回复于 2005-01-25 17:37:11 得分 0
何谓一个编译单元?Top
8 楼bug2k(bug2k)回复于 2005-01-25 17:56:01 得分 0
这样做小程序可以,如果程序大了,这样写程序调试会累死你。
还是用全局变量来做数据交换比较好,哪怕浪费一些空间。Top
9 楼XXandOO(麦猪)回复于 2005-01-25 18:08:05 得分 20
何谓一个编译单元?
{}
如果你这样写,即A知道PostThreadMessage调用会造成obj释放,之后最好pobj = 0;Top
10 楼lpschenshengxue(陈生学)回复于 2005-01-25 18:40:17 得分 0
upTop
11 楼Biecheny(漏网的鱼自由自在)回复于 2005-01-25 19:51:52 得分 0
分配一块公用内存Top
12 楼skyfine(柳荣宏)回复于 2005-01-27 14:30:11 得分 0
为什么不用全局变量?
看下面的
static obj g_obj;定义全局
//////////////////////////
A:
for( ; ; )
{
g_obj = a;//g_obj的值为a
PostThreadMessage(g_nBid,MY_MSG,(WPARAM)&g_obj,(LPARAM)sizeof(obj));//传给B
}
B:
msg b_msg;
for ( ; ; )
{
b_msg = getmsg(); //从消息队列中读一个消息
read(b_msg.wParam); //从b_msg中读传过来的值;
delete (obj*)b_msg.wParam
}
如果某次B线程循环一次花1秒钟,而同时A线程只花了0.1秒钟,也就是B的消息队列中会有10个消息,如果用全局的话,这10个消息的内容会完全相同,因为每次传值的地址都是全局变量的地址.
因为我对VC/MFC也不熟,很多功能都没用,只能用一些掌握的东西,来处理程序,希望有更好的方法!Top
13 楼skyfine(柳荣宏)回复于 2005-01-27 16:17:20 得分 0
顶Top
14 楼tide2355(疾风之狼)回复于 2005-01-28 16:10:03 得分 10
如果这块数据可以封装到类里面
把它封装成类的静态成员变量吧,尽量少用全局,
我基本上都是这样用的
Class X
{
public: static type m_obj;
CRITICAL_SECTION m_cs;
}
type X::m_obj;
BOOL X::SetObj(type *pobj)
{
if(pobj == NULL) return FALSE;
EnterCriticalSectioin(&m_cs);
m_obj = *( type*)pobj;
LeaveCriticalSection(&m_cs);
}
线程A
X x = new X
x->SetObj();
delete x;
线程B
X x = new X
x->SetObj();
delete x;Top
15 楼AntonlioX(做人要厚道)回复于 2005-05-21 22:00:43 得分 0
upTop




