将对象传递到两个std ::线程
Passing an object to two std::threads
如果我创建了一个将由两个不同的std ::线程访问的对象,那么当我创建对象或将其传递给线程时,我需要做任何特殊的规定吗?
例如:
class Alpha
{
public:
int x;
};
void Foo(Alpha* alpha)
{
while (true)
{
alpha->x++;
std::cout << "Foo: alpha.x = " << alpha->x << std::endl;
}
}
void Bar(Alpha* alpha)
{
while (true)
{
alpha->x++;
std::cout << "Bar: alpha.x = " << alpha->x << std::endl;
}
}
int main(int argc, char * argv[])
{
Alpha alpha;
alpha.x = 0;
std::thread t1(Foo, &alpha);
std::thread t2(Bar, &alpha);
t1.join();
t2.join();
return 0;
}
这可以很好地编译,并且似乎也可以运行良好。但是我还没有明确告诉我的程序,需要通过两个不同的线程访问alpha
。我应该做不同的事情吗?
您在 alpha.x
上具有竞赛条件,因为当另一个读取/写入其值时,这两个线程都可以写入。您可以通过将x
的类型更改为std::atomic<int>
或使用Mutex的读/写入访问来解决此问题。
如果要通过多个线程访问对象,则必须为同步提供规定。在您的情况下,将变量x声明为原子是足够的:
#include <atomic>
class Alpha
{
public:
std::atomic<int> x;
};
这将确保任何递增" x"的功能实际使用原子fetch_and_add()方法。这可以确保每个递增变量" x"的线程将获得x。
的唯一增量值在您发布的代码中,如果执行恰好交织在一起,则两个线程对于x的值很可能会得到1的值。
相关文章:
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 比较两个 std::chrono::time_point 实例时出错
- 如何获取两个 std::map 的公钥?
- 当两个 std::map 对象相同时
- 比较两个std::矢量/阵列,或者通常比较两个stl连续器
- 使用 C++11 在一行中连接两个 std::vector
- C 是否具有对两个STD :: sets,vectors等进行三角比较的标准方法
- 优化两个 std::vector<std::complex> 的元素乘积,使用 <float>fftw_malloc() 分配
- 操作员=在两个std :: chrono :: time_point引起错误之间
- C++:快速/并行计算两个"std::vector<double>"向量之间的L1距离
- C++:带有"std::lock_guard"的互斥锁是否足以同步两个"std::thre
- 如何获得两个 std::unordered_map 的集合交集?
- 比较两个std ::弦,以查看它们是否匹配C
- 在两个std::向量之间匹配元素
- 两个std :: unique_lock在同一静音上使用会导致死锁
- 如何将两个std :: vector结合到一个std :: vector与std :: pair
- 交换两个 std::array<T、100> 对象的成本是多少?
- 将对象传递到两个std ::线程
- 检查两个std ::函数是否相等
- 像strcmp那样比较两个std::string