Хотя это хороший вопрос, я боюсь, что у вас может быть проблема с XY, так как я не могу представить себе вескую причину для вашей проблемы. Тем не менее, через 1-2 минуты я придумал 2 решения с плюсами и минусами, но я думаю, что одно идеально для вас:
A. Когда ваши потоки почти завершены в одно и то же время и вам нужно их распечатать как можно скорее, вы можете использовать общую std::atomic<T>
с T=unsigned,int,size_t,uint32_t
, что вам нравится, или любую целочисленную атомизацию в стандартной библиотеке C при использовании C, инициализируйте ее с помощью0, и теперь каждый занятый мной поток ждет, пока его значение не станет i-1. Если это так, он печатает, а затем добавляет 1 на атомном. Конечно, из-за занятого ожидания у вас будет большая нагрузка на процессор, когда потоки ждут долго, и замедление, когда многие ждут. Но вы получите свой отпечаток как можно скорее
B. Вы просто сохраняете свой результат потока i в контейнере, может быть, вместе с его индексом, так как я предполагаю, что вы хотите больше просто напечатать i, а после того, как все потоки закончатся или периодически, сортируйте этот контейнер и затем печатайте его.
A.:
#include <iostream>
#include <atomic>
#include <thread>
#include <vector>
#include <functional>
void thread_function(unsigned i, std::atomic<unsigned>& atomic) {
while (atomic < i - 1) {}
std::cout << i << " ";
atomic += 1;
}
int main() {
std::atomic<unsigned> atomic = 0;
std::vector<std::thread> threads;
for (auto i : {3,1,2}) {
threads.push_back(std::thread(thread_function, i, std::ref(atomic)));
}
for (auto& t : threads) {
t.join();
}
std::cout << "\n";
}
Работает также в C, просто используйте там атомику.