我现在的想法是增加一个原子变量,进入访问时变量+1,退出时-1,在初始化之前判等待变量=0,然后才开始初始化,但是不太确定这个方法是否可靠
[quote=引用 11 楼 zjq9931 的回复:] 这样的方式和加锁基本差不多了。 如果怕重置数据时,其他线程访问数据,可以设置一个值,其他线程访问数据前先检测值。如果是1,循环等待(时长自己定),如果是0,正常访问。
这样的方式和加锁基本差不多了。 如果怕重置数据时,其他线程访问数据,可以设置一个值,其他线程访问数据前先检测值。如果是1,循环等待(时长自己定),如果是0,正常访问。
你的初始化是什么意思。。。不是只初始化一次的意思吗? 你是指你的数据会多次被重置吗?
[quote=引用 8 楼 _mervyn 的回复:] 你的初始化是什么意思。。。不是只初始化一次的意思吗? 你是指你的数据会多次被重置吗?
std::atomic<bool> ready(false); //初始化线程: //做一系列初始化操作... //... //... ready = true;
//访问线程: while (!ready) { std::this_thread::yield(); } // 等待 ready 变为 true. //之后才开始访问 //...
[quote=引用 1 楼 zjq9931 的回复:]初始化加锁,是没问题的。 但是多线程同时访问不能加锁?确定全是只读访问吧?全是只读访问是可以不加锁的。
初始化加锁,是没问题的。 但是多线程同时访问不能加锁?确定全是只读访问吧?全是只读访问是可以不加锁的。
这个存在一个问题,访问线程在访问的过程中,初始化线程去初始化数据了,这个风险还是存在
最好是 初始化完毕后 再启动访问线程 如果访问线程的启动不受你控制,无法办到这点的话, 那可以考虑这样: std::atomic<bool> ready(false); //初始化线程: //做一系列初始化操作... //... //... ready = true; //访问线程: while (!ready) { std::this_thread::yield(); } // 等待 ready 变为 true. //之后才开始访问 //...
65,186
社区成员
250,526
社区内容
加载中
试试用AI创作助手写篇文章吧