[问题] 多线程及静态变量的问题

楼主: su27 (su27)   2022-05-11 12:03:01
开发平台(Platform): (Ex: Win10, Linux, ...)
win10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
qt
全局静态变量
static vector<Class_A> Class_A_List;
static int fun1()
{
//使用到Class_A_List
}
static int fun2()
{
//使用到Class_A_List
}
我在程式中使用了多线程
每个线程在启动时会创建
Class_A Obj; //会有很多个
并且加入到全局静态变量内
Class_A_List.push_back(Obj);
并使用静态函数
fun1();
fun2();
PS:线程各自有Obj
只是全部储存在Class_A_List
调用fun1()及fun2得去Class_A_List找出Obj
去读写Obj
我目前使用线程一个执行完再接一个不会出错
第一个线程还没结束 就启动第二个线程
程式就会终止
问题
请问一下
1.多线程能同时使用同一个静态函数吗?
2.多线程能同时使用同一个全局静态变量 如上面的Class_A_List?
即便它们是各自读取修改各自的Obj
谢谢
作者: nh60211as   2022-05-11 12:15:00
加入元素后的大小如果超过 capacity 会 reallocate等一下 vector 哪来的 add
作者: colako (凯风快晴)   2022-05-11 12:38:00
我觉得你好像是想要一个 thread_local 的东西?
作者: layan (教练我想打球 T_T)   2022-05-11 13:13:00
mutex
作者: Lipraxde (Lipraxde)   2022-05-11 13:25:00
Critical section 要加 lock 保护如果各个 thread 只使用各自的 data 的话,比起用 thread_local 会更建议是弄个各自的 context 去管理,因为thread_local 在某些使用情境下会有 performance 问题
楼主: su27 (su27)   2022-05-11 22:38:00
加入thread_local就能正常运行,谢谢
作者: LPH66 (-6.2598534e+18f)   2022-05-12 00:49:00
是说, 用了 thread_local 就不需要你自己用个容器装了写一个 thread_local Class_A Obj; 就会是各 thread 各自有不过看你要这样装可能你的 Class_A 物件有某些程度的共用这样的话 thread_local 或许不一定会是你真正需要的解建议照 Lipraxde 提的检视一下你执行绪资料的使用方式有些时候执行绪需要的资料直接开在执行绪函数里会更好管理
作者: hichcock (快乐一整年 ^^~~~)   2022-05-13 11:25:00
你的问题简化就是...变量操作是不是 "不可分割" 的如果不是....就要自己去保护他
作者: wulouise (在线上!=在电脑前)   2022-05-14 09:38:00
先解释为什么你要放进global的地方用..如果任意thread要r/w任意obj 那就自己保护好
作者: OnlyRD (里巷人)   2022-05-15 20:15:00
这跟全局静态变量无关吧?主要是多线程启动后“同时”去初始化共用的资料,没有thread once、mutex、task control或者lockfree资料结构怎么可能不挂?

Links booklink

Contact Us: admin [ a t ] ucptt.com