Это моя первая попытка написания многопоточного кода на C ++, и похоже, что он создал гонку данных.Вот полный файл.Он был скомпилирован как: g ++ -pthread foo.cpp
#include <iostream>
#include <iomanip>
#include <thread>
const int SIZE = 5;
void mult(int x, int y) {
std::cout.width(3);
std::cout << std::right << x * y << "* ";
}
void add(int x, int y) {
std::cout.width(3);
std::cout << std::right << x + y << "+ ";
}
int main() {
int a = 0;
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
std::thread first(mult, i, j);
std::thread second(add, i, j);
first.join();
second.join();
std::cout << " | ";
}
std::cout << "\n";
}
return 0;
}
Вывод скремблируется невоспроизводимым образом при каждом запуске, например:
0* 0+ | 0* 1+ | 2 0+ * | 0* 3+ | 0* 4+ |
0* 1+ | 1* 2+ | 2* 3+ | 3* 4+ | 4* 5+ |
0* 2+ | 2* 3+ | 4* 4+ | 6* 5+ | 8* 6+ |
0* 3+ | 3 4* + | 6* 5+ | 9* 6+ | 12* 7+ |
0* 4+ | 4* 5+ | 8* 6+ | 12* 7+ | 16* 8+ |
или
0* 0+ | 0* 1+ | 0* 2+ | 0* 3+ | 0* 4+ |
0* 1+ | 1* 2+ | 2* 3+ | 3* 4+ | 4* 5+ |
0* 2+ | 2* 3+ | 4* 4+ | 6* 5+ | 8* 6+ |
0* 3+ | 3* 4+ | 6* 5+ | 9* 6+ | 12* 7+ |
0* 4+ | 4* 5+ | 8* 6+ | 12* 7+ | 16* 8+ |
Есть ли способ обойти эту проблему?Из этого я многое узнал об объектах cout, но разве это правило, что только одному потоку должен быть разрешен доступ к cout одновременно, особенно при использовании iomanip?
Редактировать: я понимаю, что согласно:http://www.cplusplus.com/reference/iomanip/setw/ То, что использование iomanip таким способом может вызвать скачки данных.Итак, вопрос в том, стоит ли пытаться это делать?Должен ли каждый поток создаваться, заниматься своим делом, а затем присоединяться?(т. е. вообще нет потоков) и все?Если это так, это нормально, основная идея с параллелизмом будет заключаться в том, чтобы программа открывала несколько параллельных объектов fstream, так что пользователю не пришлось бы ждать этого, и один поток для cout был бы в порядке.То, что я спрашиваю, это стандартный подход?