首页
社区
课程
招聘
[求助]多线程 访问同一结构体
发表于: 2008-7-15 17:33 9042

[求助]多线程 访问同一结构体

2008-7-15 17:33
9042
我主要是想在多个线程中 .修改同一样结构体..
我的写法如下:

struct INFO{

        //........定义的结构体...........         

};

//申请 INFO 的空间
INFO *info=new INFO;

//传递这个结构的地址 建立二个线程
CreateThread(0,0,Tfun1,info,0,0);
CreateThread(0,0,Tfun1,info,0,0);

线程中接收参数是:
INFO *info=(INFO *)l;

实验不成功.
结果是 第一个线程中改变 info ,并不影响第二个线程中的值,好像这二个线程运行的不是同一个结构体

但是.我建线程时,传入的是同一地址啊..而且在传入前.也经过 new 了,也就是内存已经分配了空间啊

不知道问题出自哪里...

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
线程同步的问题
2008-7-15 19:25
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个是与线程同步没关系的..我试过了!!!

morning 我给写过邮件了..

我的邮箱是:

521141215@qq.com
2008-7-15 19:44
0
雪    币: 962
活跃值: (1681)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
new 分配的空间在堆栈
在不同线程间使用 好像很容易出问题
2008-7-16 12:34
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我感觉这个说的有道理 ....应该 不是 线程同步那里问题

请问...如果.我想多个线程里访问.这个结构体.我应该怎么操作?

当然.是可以用全局变量 的..

但是.我要做的是.动态申请空间 .

我要根据实际情况.new INFO.然后再建二个线程操作操作这个结构体(如果只有一个线程.会麻烦点)

所以.用一个全局变量 不好弄..如果一定要全局变量.那也只能用 全局的一个数组!!

但是我希望有办法..像这样new 一个空间..传个地址...就搞定.????
2008-7-16 12:44
0
雪    币: 287
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
我觉得还是线程同步的问题
你试着输出日志
INFO *info=(INFO *)l;
这个地方输出 info的值,看是否为同一地址

我认为不会有你说的这种现象..
2008-7-16 12:48
0
雪    币: 8599
活跃值: (5065)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
操作系统调度的问题。
最好是用个同步对象。
2008-7-16 12:56
0
雪    币: 454
活跃值: (1673)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
多个线程同时读写同一个数据,必定是要同步的,没写同步代码肯定是有问题的,写个代码测试一下就知道了

#include "stdafx.h"

CRITICAL_SECTION cs;

struct ThreadStruct    [COLOR="Green"]//线程结构[/COLOR]
{
	int nTest;
	float fTest;
};

[COLOR="Green"]//线程函数[/COLOR]
DWORD CALLBACK ThreadFun(LPVOID pParam)
{
	ThreadStruct* pThreadStruct = (ThreadStruct*)pParam;

	EnterCriticalSection(&cs);		[COLOR="Green"]//同步好线程[/COLOR]
	cout << "nTest:\t" << pThreadStruct->nTest << endl
		<< "fTest:\t" << pThreadStruct->fTest << endl;

	pThreadStruct->nTest = 5000;
	pThreadStruct->fTest = 3.5;
	LeaveCriticalSection(&cs);

	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	InitializeCriticalSection(&cs);

	ThreadStruct* pThreadStruct = new ThreadStruct;
	pThreadStruct->nTest = 0;
	pThreadStruct->fTest = 0;
	CreateThread(0, 0, ThreadFun, pThreadStruct, 0, 0);
	CreateThread(0, 0, ThreadFun, pThreadStruct, 0, 0);

	system("pause");
	return 0;
}
上传的附件:
2008-7-16 13:18
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
LZ的回复比我详细,用临界段控制不错的

可以考虑在INFO这个结构中封装require,release类的函数,省去在调用方放入同步代码,毕竟数据自身的同步是这个数据对象的事
2008-7-16 16:18
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢各位的热心回复...

结果是我根据 shizhen 的提示...输出线程地址进行调试..

结果发现.是自己在一个函数中弄错了..访问一切正常了!

上面线程中访问同一个结构是是可以的.

自己大意.呵!谢谢
2008-7-16 17:12
0
游客
登录 | 注册 方可回帖
返回
//