为了账号安全,请及时绑定邮箱和手机立即绑定

我的想法是不是要在方法开始加锁,方法最后解锁,才不会起冲突,那位慕友帮我解决下!

我的想法是不是要在方法开始加锁,方法最后解锁,才不会起冲突,那位慕友帮我解决下!

C++
慕哥6287543 2023-03-03 14:10:05
问题是这样的:有一个方法A(int a)经过方法处理a 后,输出一个值b,我要启动两个线程都去执行它,但是输出的结果比较乱,理想结果应该是 线程1+参数a1得到结果b1,线程2+参数a2得到结果b2,实际的结果是两个线程都输出b2,或a2等等。
查看完整描述

3 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

你参数是通过指针的方法送进去的?然后结果每个线程要读数据的时候数据已经不是送入时候的数据了吗
送线程参数的时候,为每个线程分配一个新的空间来保存这个“参数”。
例如你原来是
int a = 10;
_beginthreadex(0, 0, ThreadFunc, &a, 0, 0);
a = 20;
_beginthreadex(0, 0, ThreadFunc, &a, 0, 0);
现在要
int a = 10;
int *p = new int;
*p = a;
_beginthreadex(0, 0, ThreadFunc, p, 0, 0);
p = new int;
a = 20;
*p = a;
_beginthreadex(0, 0, ThreadFunc, p, 0, 0);

记住线程函数退出前要delete掉这个参数p

 


查看完整回答
反对 回复 2023-03-06
?
慕慕森

TA贡献1856条经验 获得超17个赞

这个方法A是否可以做到线程安全?即互不干扰执行?

否则加锁,感觉起不到并发的作用。

另外,如果这个方法的确无法做到线程安全,建议也只是临界区加锁,即存在冲突的那一段代码加锁,否则影响效率。

查看完整回答
反对 回复 2023-03-06
?
largeQ

TA贡献2039条经验 获得超8个赞

没听懂你要怎么输出,给你创建临界区的函数:
CRITICAL_SECTION m_csList;
InitializeCriticalSection(&m_csList);
EnterCriticalSection(&m_csList);
LeaveCriticalSection(&m_csList);
DeleteCriticalSection(&m_csList);

查看完整回答
反对 回复 2023-03-06
  • 3 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号