从多个线程C 更改共享变量
Changing shared variables from multiple threads c++
我想知道是否有任何方法可以实现从C 中的多个线程更改共享/全局变量
想象此代码:
#include <vector>
#include <thread>
void pushanother(int x);
std::vector<int> myarr;
void main() {
myarr.push_back(0);
std::thread t1(pushanother, 2);
t1.join();
}
void pushanother(int x) {
myarr.push_back(x);
}
在这种特殊情况下,代码为(除非线程上缺少连接),这是令人惊讶的。
这是因为std::thread
的构造函数会导致内存围栏操作,并且第一个线程不会修改或读取该栅栏后的向量状态。
实际上,您已将向量的控制转移到第二个线程。
但是,修改代码以表示更正常的情况需要明确的锁:
#include <vector>
#include <thread>
#include <mutex>
void pushanother(int x);
// mutex to handle contention of shared resource
std::mutex m;
// the shared resource
std::vector<int> myarr;
auto push_it(int i) -> void
{
// take a lock...
auto lock = std::unique_lock<std::mutex>(m);
// modify/read the resource
myarr.push_back(i);
// ~lock implicitly releases the lock
}
int main() {
std::thread t1(pushanother, 2);
push_it(0);
t1.join();
}
void pushanother(int x) {
push_it(x);
}
我认为这是您问题的确切完整示例:
http://www.cplusplus.com/reference/mutex/mutex/
相关文章:
- C++ 两个线程,共享几个整数变量
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- 多个 OpenMP 线程读取(而不是写入)共享变量的性能成本?
- 是局部unordered_map变量线程在C 中安全的线程
- 提升线程问题,当一个线程与另一个线程没有相同的副本时如何共享变量?
- 如果两个线程调用同一个函数,但函数中的所有变量都是局部变量,我还需要担心线程之间共享数据吗?
- 使用共享变量进行线程处理
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- C 将在类中创建的线程共享同一类变量
- Eigen & OpenMP : 由于错误共享和线程开销,没有并行化
- 为什么跨线程更改共享变量的代码显然没有受到竞争条件的影响
- 如何使类静态变量线程安全
- 从多个线程C 更改共享变量
- 管理多线程应用程序中的共享变量
- 增强多线程和共享变量
- 命名空间中的全局变量 - 线程中的值不同
- 静态变量与堆栈变量:线程安全与堆栈大小
- 共享提升::shared_ptr<>变量线程安全吗?
- 在标准c++和OpenCL之间共享多线程代码
- 在析构函数中pthead_join()类成员变量线程是否明智?