cameron314 / concurrentqueue

A fast multi-producer, multi-consumer lock-free concurrent queue for C++11
Other
9.53k stars 1.66k forks source link

segfault in try_dequeue #328

Open tesla1060 opened 1 year ago

tesla1060 commented 1 year ago

Hi, I am getting a segfault in my code, it is a multi-thread program, the core dump is as below,

(gdb) bt full
#0  0x0000000000441540 in try_dequeue<std::shared_ptr<Frame> > (item=<synthetic pointer>, this=0xbe3c50) at /root/projects/active/user/include/third_party/concurrentqueue.h:1111
        nonEmptyCount = 0
        best = 0x0
        bestSize = 0
#1  ConsumerNice::listening_nice (this=0xbe3c40) at /root/projects/active/user/include/concurrency/consumer_nice.h:45
        frame = std::shared_ptr (empty) 0x0
#2  0x00000000004c0530 in execute_native_thread_routine ()
No symbol table info available.
#3  0x00007f3eb3f81e65 in start_thread () from /lib64/libpthread.so.0
No symbol table info available.
#4  0x00007f3ead70a88d in clone () from /lib64/libc.so.6
No symbol table info available.

My code is as below:

    void listening_nice() {
        while (true) {
            std::shared_ptr<Frame> frame;
            if (nice_queue.try_dequeue(frame)) {
                on_frame_nice(frame);
            }
        }
    }

I look at concurrentqueue.h:1111,

    bool try_dequeue(U& item)
    {
        // Instead of simply trying each producer in turn (which could cause needless contention on the first
        // producer), we score them heuristically.
        size_t nonEmptyCount = 0;
        ProducerBase* best = nullptr;
        size_t bestSize = 0;
        for (auto ptr = producerListTail.load(std::memory_order_acquire); nonEmptyCount < 3 && ptr != nullptr; ptr = ptr->next_prod()) {
            auto size = ptr->size_approx();
            if (size > 0) {
                if (size > bestSize) {
                    bestSize = size;
                    best = ptr;
                }
                ++nonEmptyCount;
            }
        }

didnt see why it has segfault.

cameron314 commented 1 year ago

How is nice_queue created? When is it destructed? What is the producer thread doing?