请教个多线程问题

如梦如幻应作如是观 2019-01-06 09:37:22
先说一下需求,想要在启动的线程函数里实现socket发送的功能,想要启动起来的线程里,每个线程的参数相互独立,不要后面启动线程把前面的参数给覆盖掉,请问该怎么写,有没有现成的例子可以参考。多谢

typedef struct param
{SOCKET sHandle;
int num;
char * msg;
};

就是想将上面的结构体作为参数传入__beginthreadex启动的线程函数里,但是每次线程函数执行到最后就剩下一个参数有效了,其他的参数好像被覆盖掉了,求答疑。
多谢
...全文
621 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 8 楼 棉猴 的回复:
[quote=引用 6 楼 如梦如幻应作如是观 的回复:] 也就是说,只要我每个线程传入的结构体对象确实是不同对象,同时保证对象的生命周期,就每个线程使用的对象是不同对象了对吗? 线程里面 传入参数获取可以用memcpy来获取传入的值吗?memcpy(&线程内结构体对象,param, sizeof(Param))这样? [quote=引用 4 楼 我还在迷路 的回复:] 你这个现象有两个原因: 1、你传到每个线程里面的变量是同一个变量,地址是同一个,所有的线程都在同时使用同一个变量; 2、你说的最后只有一个参数是可用的,应该是int num是可用的吧,msg和sHandle应该都被你释放了,你传入线程的参数是一个局部变量,在线程执行的时候,这个变量就已经被销毁了 每个线程的参数,在各自线程使用的时候需要保证线程的数据安全,如果多线程用的同一个变量,需要加锁保护起来; 启动线程时传入的参数不要使用局部变量,在线程执行期间要保证参数的生命周期,可以申请内存,也可以使用静态或者全局变量
引用 5 楼 chenxiaohui318 的回复:
[quote=引用 4 楼 我还在迷路的回复:]你这个现象有两个原因: 1、你传到每个线程里面的变量是同一个变量,地址是同一个,所有的线程都在同时使用同一个变量; 2、你说的最后只有一个参数是可用的,应该是int num是可用的吧,msg和sHandle应该都被你释放了,你传入线程的参数是一个局部变量,在线程执行的时候,这个变量就已经被销毁了 每个线程的参数,在各自线程使用的时候需要保证线程的数据安全,如果多线程用的同一个变量,需要加锁保护起来; 启动线程时传入的参数不要使用局部变量,在线程执行期间要保证参数的生命周期,可以申请内存,也可以使用静态或者全局变量
一楼只是写个例子,首先数组是不是局部变量不说,每个线程里直接传的不同的结构体对象,怎么会是相同参数?[/quote][/quote] 你是希望在子线程内部修改的传入到线程内部的变量,然后在这个子线程外面还有使用这个变量,并且要希望这个变量没有被子线程修改?[/quote] 外部不修改,我只是希望每个线程使用的变量不会相互影响,不会线程2修改了线程1使用的变量。这个变量在外部不会修改,在线程内部可能修改,只会取它某些字段的值。
棉猴 2019-01-10
  • 打赏
  • 举报
回复
引用 6 楼 如梦如幻应作如是观 的回复:
也就是说,只要我每个线程传入的结构体对象确实是不同对象,同时保证对象的生命周期,就每个线程使用的对象是不同对象了对吗?

线程里面 传入参数获取可以用memcpy来获取传入的值吗?memcpy(&线程内结构体对象,param, sizeof(Param))这样?

[quote=引用 4 楼 我还在迷路 的回复:]
你这个现象有两个原因:
1、你传到每个线程里面的变量是同一个变量,地址是同一个,所有的线程都在同时使用同一个变量;
2、你说的最后只有一个参数是可用的,应该是int num是可用的吧,msg和sHandle应该都被你释放了,你传入线程的参数是一个局部变量,在线程执行的时候,这个变量就已经被销毁了


每个线程的参数,在各自线程使用的时候需要保证线程的数据安全,如果多线程用的同一个变量,需要加锁保护起来;
启动线程时传入的参数不要使用局部变量,在线程执行期间要保证参数的生命周期,可以申请内存,也可以使用静态或者全局变量


引用 5 楼 chenxiaohui318 的回复:
[quote=引用 4 楼 我还在迷路的回复:]你这个现象有两个原因:
1、你传到每个线程里面的变量是同一个变量,地址是同一个,所有的线程都在同时使用同一个变量;
2、你说的最后只有一个参数是可用的,应该是int num是可用的吧,msg和sHandle应该都被你释放了,你传入线程的参数是一个局部变量,在线程执行的时候,这个变量就已经被销毁了


每个线程的参数,在各自线程使用的时候需要保证线程的数据安全,如果多线程用的同一个变量,需要加锁保护起来;
启动线程时传入的参数不要使用局部变量,在线程执行期间要保证参数的生命周期,可以申请内存,也可以使用静态或者全局变量

一楼只是写个例子,首先数组是不是局部变量不说,每个线程里直接传的不同的结构体对象,怎么会是相同参数?[/quote][/quote]
你是希望在子线程内部修改的传入到线程内部的变量,然后在这个子线程外面还有使用这个变量,并且要希望这个变量没有被子线程修改?
  • 打赏
  • 举报
回复
也就是说,只要我每个线程传入的结构体对象确实是不同对象,同时保证对象的生命周期,就每个线程使用的对象是不同对象了对吗? 线程里面 传入参数获取可以用memcpy来获取传入的值吗?memcpy(&线程内结构体对象,param, sizeof(Param))这样?
引用 4 楼 我还在迷路 的回复:
你这个现象有两个原因: 1、你传到每个线程里面的变量是同一个变量,地址是同一个,所有的线程都在同时使用同一个变量; 2、你说的最后只有一个参数是可用的,应该是int num是可用的吧,msg和sHandle应该都被你释放了,你传入线程的参数是一个局部变量,在线程执行的时候,这个变量就已经被销毁了 每个线程的参数,在各自线程使用的时候需要保证线程的数据安全,如果多线程用的同一个变量,需要加锁保护起来; 启动线程时传入的参数不要使用局部变量,在线程执行期间要保证参数的生命周期,可以申请内存,也可以使用静态或者全局变量
引用 5 楼 chenxiaohui318 的回复:
[quote=引用 4 楼 我还在迷路的回复:]你这个现象有两个原因: 1、你传到每个线程里面的变量是同一个变量,地址是同一个,所有的线程都在同时使用同一个变量; 2、你说的最后只有一个参数是可用的,应该是int num是可用的吧,msg和sHandle应该都被你释放了,你传入线程的参数是一个局部变量,在线程执行的时候,这个变量就已经被销毁了 每个线程的参数,在各自线程使用的时候需要保证线程的数据安全,如果多线程用的同一个变量,需要加锁保护起来; 启动线程时传入的参数不要使用局部变量,在线程执行期间要保证参数的生命周期,可以申请内存,也可以使用静态或者全局变量
一楼只是写个例子,首先数组是不是局部变量不说,每个线程里直接传的不同的结构体对象,怎么会是相同参数?[/quote]
大苟姬 2019-01-09
  • 打赏
  • 举报
回复
引用 4 楼 我还在迷路的回复:
你这个现象有两个原因: 1、你传到每个线程里面的变量是同一个变量,地址是同一个,所有的线程都在同时使用同一个变量; 2、你说的最后只有一个参数是可用的,应该是int num是可用的吧,msg和sHandle应该都被你释放了,你传入线程的参数是一个局部变量,在线程执行的时候,这个变量就已经被销毁了 每个线程的参数,在各自线程使用的时候需要保证线程的数据安全,如果多线程用的同一个变量,需要加锁保护起来; 启动线程时传入的参数不要使用局部变量,在线程执行期间要保证参数的生命周期,可以申请内存,也可以使用静态或者全局变量
一楼只是写个例子,首先数组是不是局部变量不说,每个线程里直接传的不同的结构体对象,怎么会是相同参数?
我还在迷路 2019-01-08
  • 打赏
  • 举报
回复
你这个现象有两个原因: 1、你传到每个线程里面的变量是同一个变量,地址是同一个,所有的线程都在同时使用同一个变量; 2、你说的最后只有一个参数是可用的,应该是int num是可用的吧,msg和sHandle应该都被你释放了,你传入线程的参数是一个局部变量,在线程执行的时候,这个变量就已经被销毁了 每个线程的参数,在各自线程使用的时候需要保证线程的数据安全,如果多线程用的同一个变量,需要加锁保护起来; 启动线程时传入的参数不要使用局部变量,在线程执行期间要保证参数的生命周期,可以申请内存,也可以使用静态或者全局变量
  • 打赏
  • 举报
回复
引用 1 楼 赵4老师 的回复:
仅供参考:
#define MAXMSGLEN 1024
#define MAXTHREADNUM 10
typedef struct param {
    SOCKET sHandle;
    int num;
    char msg[MAXMSGLEN];
} PARAM;
PARAM pars[MAXTHREADNUM];
int i;
for (i=0;i<MAXTHREADNUM;i++) {
    pars[i].num=i;
    _beginthreadex(...,&pars[i],...);
}
请教下赵老师,在_beginthreadex启动的线程函数里,传入的参数要怎么取出来做处理,来保证每个线程都是独立互不影响的呢
赵4老师 2019-01-07
  • 打赏
  • 举报
回复
象我这样写,本来就是互不影响的。
赵4老师 2019-01-06
  • 打赏
  • 举报
回复
仅供参考:
#define MAXMSGLEN 1024
#define MAXTHREADNUM 10
typedef struct param {
SOCKET sHandle;
int num;
char msg[MAXMSGLEN];
} PARAM;
PARAM pars[MAXTHREADNUM];
int i;
for (i=0;i<MAXTHREADNUM;i++) {
pars[i].num=i;
_beginthreadex(...,&pars[i],...);
}

65,187

社区成员

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

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