Erstellen einer Warteschlange Blockiert

Manchmal ist diese Umsetzung und Durchführung von BlockingQueue funktioniert einfach. Manchmal ist es segfaults. Irgendeine Idee warum?

#include <thread>
using std::thread;
#include <mutex>
using std::mutex;
#include <iostream>
using std::cout;
using std::endl;
#include <queue>
using std::queue;
#include <string>
using std::string;
using std::to_string;
#include <functional>
using std::ref;

template <typename T>
class BlockingQueue {
private:
    mutex mutex_;
    queue<T> queue_;
public:
    T pop() {
        this->mutex_.lock();
        T value = this->queue_.front();
        this->queue_.pop();
        this->mutex_.unlock();
        return value;
    }

    void push(T value) {
        this->mutex_.lock();
        this->queue_.push(value);
        this->mutex_.unlock();
    }

    bool empty() {
        this->mutex_.lock();
        bool check = this->queue_.empty();
        this->mutex_.unlock();
        return check;
    }
};

void fillWorkQueue(BlockingQueue<string>& workQueue) {
    int size = 40000;
    for(int i = 0; i < size; i++)
        workQueue.push(to_string(i));
}

void doWork(BlockingQueue<string>& workQueue) {
    while(!workQueue.empty()) {
        workQueue.pop();
    }   
}

void multiThreaded() {
    BlockingQueue<string> workQueue;
    fillWorkQueue(workQueue);
    thread t1(doWork, ref(workQueue));
    thread t2(doWork, ref(workQueue));
    t1.join();
    t2.join();
    cout << "done\n";
}

int main() {
    cout << endl;

    //Multi Threaded
    cout << "multiThreaded\n";
    multiThreaded();
    cout << endl;
}
  • Wenn es segfaults, ich nehme an, du könntest die Zeile code wo ist es passiert? Könnte nur hilfreich sein, zu wissen...
  • Was passiert, wenn Sie überprüfen, ob die itemQueue leer ist, dann lassen Sie andere thread einige Arbeit, und dann pop() ein item???
  • Diese Frage hat genug code, jeder kann es ausprobieren und selbst sehen, wo das problem ist. Gibt es nicht viel überflüssigen code, so dass es nicht weit Weg ein lehrbuch SSCCE und sicherlich zu vertreten hat.
  • Ich habe eine harte Zeit zu glauben, dass "Wo ist der Fehler in diesem Programm?" jemals sein könnte ist eine gute Frage.
  • Gerne erklären mein denken auf diese eine weitere auf meta oder im chat, wenn Sie möchten, aber lassen Sie uns das bitte vermeiden Sie Chats in den Kommentaren.
Schreibe einen Kommentar