gpt4 book ai didi

c++ - 同时从不同线程填充数组c++

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:22 25 4
gpt4 key购买 nike

首先,我认为很重要的一点是,我是多线程的新手,对它知之甚少。我试图使用线程在 C++ 中编写一些程序,遇到了一个问题(问题),我现在将尝试向您解释:

我想使用多个线程来填充一个数组,这是我的代码:

static const int num_threads = 5;
int A[50], n;

//------------------------------------------------------------
void ThreadFunc(int tid)
{
for (int q = 0; q < 5; q++)
{
A[n] = tid;
n++;
}
}

//------------------------------------------------------------
int main()
{
thread t[num_threads];
n = 0;
for (int i = 0; i < num_threads; i++)
{
t[i] = thread(ThreadFunc, i);
}

for (int i = 0; i < num_threads; i++)
{
t[i].join();
}
for (int i = 0; i < n; i++)
cout << A[i] << endl;

return 0;
}

作为这个程序的结果,我得到:000001个1个1个1个1个2个2个2个2个2个等等。

据我了解,仅当第一个线程完成将所有元素写入数组时,第二个线程才开始将元素写入数组。问题是为什么线程不能同时工作?我的意思是为什么我没有得到类似的东西:

01个2个03个1个4个等等。

有什么办法可以解决这个问题吗?

提前谢谢你。

最佳答案

由于从多个线程访问n,因此需要同步这些访问,以便一个线程中所做的更改不会与另一个线程中所做的更改发生冲突。有(至少)两种方法可以做到这一点。

首先,您可以使n 成为原子变量。只需更改其定义,并在使用该值的地方进行增量:

std::atomic<int> n;

...

A[n++] = tid;

或者您可以将所有访问都包装在关键部分中:

std::mutex mtx;
int next_n() {
std::unique_lock<std::mutex> lock(mtx);
return n++;
}

并且在每个线程中,不是直接递增n,而是调用该函数:

A[next_n()] = tid;

这比原子访问慢得多,所以在这里不合适。在更复杂的情况下,这将是正确的解决方案。

关于c++ - 同时从不同线程填充数组c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39548135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com