首页 > 解决方案 > 为什么 boost::shared_mutex 不能阻塞超过 128 个线程?

问题描述

为什么 boost::shared_mutex 不能阻塞超过 128 个线程?这是一个众所周知的问题吗?

boost1.67+mscv2015

    boost::shared_mutex mutex; 
    for (int i = 0; i < 256; i++)
    {
        std::thread([&]() {
                printf("begin\n");
                {    //crash after 128 times
                    boost::unique_lock<boost::shared_mutex> lock(mutex);
                    Sleep(5000);
                }
                printf("end\n");
            }).detach();
    }
    Sleep(5000);

标签: c++boost

解决方案


我认为这是实施限制。来自/boost/thread/win32/shared_mutex.hpp

namespace boost
{
    class shared_mutex
    {
    private:
        struct state_data
        {
            unsigned shared_count:11,
                shared_waiting:11,
                exclusive:1,
                upgrade:1,
                exclusive_waiting:7,
                exclusive_waiting_blocked:1;

            //...
        };
   // ...
   };
//...
}

看到那exclusive_waiting是 7 位,这意味着它最多只能容纳 127 的值。

认为这个想法是使状态适合 32 位,以使其适用于有效的原子操作,即使对于 32 位 Windows 进程也是如此。

至于为什么它对于 64 位来说并不大 - 也许是为了简单起见,或者它可能支持 32 位和 64 位之间的共享内存,不确定。

要解决此问题,请考虑std::shared_mutex,它是在 之上实现的SRWLOCK,并且不会遇到此问题。除非您需要支持 Windows XP,否则在这种情况下不是一个选项。

(或者,作为一种解决方法,考虑避免无论如何都不太可能有效的模式,正如@sehe 评论的那样)


推荐阅读