int main() { vector<thread> threads; int n, m; cin >> n; for (int i = 0; i < n; i++) { if (i % 2 == 0) threads.push_back(thread(pushElem, i)); else threads.push_back(thread(popElem)); } for (int i = 0; i < n; i++) { threads[i].join(); } while(!sync_queue.empty()) { cout << sync_queue.front() << " "; sync_queue.pop(); } return 0; }
bool master(size_t senderNumber, size_t receiverNumber) { using std::vector; const size_t DATA_SIZE = 1000000; vector<int> source(DATA_SIZE); std::uniform_int_distribution<int> valuesRandom(-1000, 1000); for (size_t i = 0; i < DATA_SIZE; ++i) { source[i] = valuesRandom(engine); } SyncQueue<C> syncQueue; // Создаем отправителей. vector<std::thread> senders; size_t readBlockSize = (DATA_SIZE + senderNumber - 1) / senderNumber; for (size_t i = 0; i < senderNumber; ++i) { senders.push_back( std::thread(sender<C>, std::ref(source), std::ref(syncQueue), i * readBlockSize, readBlockSize)); } // Создаем принимающие потоки. vector<int> dist(DATA_SIZE, 0); vector<std::thread> receivers; size_t writeBlockSize = (DATA_SIZE + receiverNumber - 1) / receiverNumber; for (size_t i = 0; i < receiverNumber; ++i) { receivers.push_back( std::thread(receiver<C>, std::ref(dist), std::ref(syncQueue), i * writeBlockSize, writeBlockSize)); } for (size_t i = 0; i < senders.size(); ++i) { senders[i].join(); } for (size_t i = 0; i < receivers.size(); ++i) { receivers[i].join(); } // Проверяем результат. std::sort(source.begin(), source.end()); std::sort(dist.begin(), dist.end()); return source == dist && syncQueue.empty(); }