提升线程死锁,任何人都可以检查原因

boost thread deadlock, can anyone check why?

本文关键字:都可以 检查 任何人 线程 死锁      更新时间:2023-10-16

我试图编写一个可以具有多线程读写的程序。它可以通过一次读取和一次写入正常工作,但是当我使用两次读取和一次写入时,它以死锁告终。

谁能帮忙检查一下?

const int BUF_SIZE = 10;
const int ITERS = 100;
boost::mutex io_mutex;
class buffer
{
public:
    typedef boost::mutex::scoped_lock scoped_lock;
    buffer() : p(0), c(0), full(0)
    {}
    void put(int m)
    {
        scoped_lock lock(mutex);
        if (full == BUF_SIZE)
        {
            {
                boost::mutex::scoped_lock lock(io_mutex);
                std::cout << "Buffer is full. Waiting..." << std::endl;
            }
            while (full == BUF_SIZE)
                cond.wait(lock);
        }
        buf[p] = m;
        p = (p+1) % BUF_SIZE;
        ++full;
        cond.notify_all();
    }
    int get()
    {
        scoped_lock lk(mutex);
        if (full == 0)
        {
            {
                boost::mutex::scoped_lock lock(io_mutex);
                std::cout << "Buffer is empty. Waiting..." << std::endl;
            }
            while (full == 0)
                cond.wait(lk);
        }
        int i = buf[c];
        c = (c+1) % BUF_SIZE;
        --full;
        cond.notify_one();
        return i;
    }
private:
    boost::mutex mutex;
    boost::condition cond;
    unsigned int p, c, full;
    int buf[BUF_SIZE];
};
buffer buf;
void writer()
{
    for (int n = 0; n < ITERS; ++n)
    {
        {
            boost::mutex::scoped_lock lock(io_mutex);
            std::cout << "sending: " << n << std::endl;
        }
        buf.put(n);
    }
}
void reader()
{
    for (int x = 0; x < ITERS; ++x)
    {
        int n = buf.get();
        {
            boost::mutex::scoped_lock lock(io_mutex);
            std::cout << "reader1: received: " << n <<  std::endl;
        }
    }
}
int main(int argc, char* argv[])
{
    boost::thread thrd1(&reader);
    boost::thread thrd2(&writer);
    boost::thread thrd3(&reader);
    std::string str;
    thrd1.join();
    thrd2.join();
    thrd3.join();
    std::getline(std::cin,str);
}

你可能在这里失去了森林。 您的代码写入 ITERS 值,但尝试读取 2 * ITERS 值,因为您有两个读取器。 那行不通。

您至少必须写入 2 * ITERS 值才能完成程序。