Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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();
}