簡體   English   中英

分段錯誤:使用升壓互斥鎖時為11

[英]Segmentation fault: 11 while using boost mutex

我實現了一個基於boost互斥鎖的鎖定宏,代碼如下:

#include <boost/thread.hpp>
#include <iostream>

#define LOCK(x) if(Lock _lock_=x){}else

class Mutex{
public:
    friend class Lock;

private:
    boost::mutex mutex_;

    void Lock(){
        mutex_.lock();
    };

    void Unlock(){
        mutex_.unlock();
    };
};

class Lock{
public:
    Lock(Mutex& mutex):mutex_(mutex){mutex_.Lock();};
    ~Lock(){mutex_.Unlock();};

    operator bool() const {
        return false;
    }

private:
    Mutex& mutex_;
};

void wait(int seconds)
{
    boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}

Mutex mtx;

void thread()
{
    for (int i = 0; i < 5; ++i)
    {
        LOCK(mtx){
            wait(1);
            std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl;
        }
    }
}

int main()
{
    boost::thread t1(thread);
    boost::thread t2(thread);
    t1.join();
    t2.join();
}

我使用clang++ -std=c++11 -stdlib=libc++ lock_raii.cc -lboost_system -lboost_thread在Mac OS中進行了編譯。 當我運行它時,出現Segmentation fault: 11

有什么問題嗎?

除了這個方法至少值得懷疑的事實之外,我看不到代碼有問題。 Linux上的gcc v4.7.0也不存在問題(沒有分段錯誤)。 因此,您可能無法正確設置Boost或某個地方存在錯誤。 您應該在調試器下運行程序,並查看出現問題的位置。 理論上,此代碼:

if(Lock _lock_=x){}else

可以編譯為:

if(Lock _lock_= Lock(x) ){}else

並調用復制ctor,並在互斥鎖上進行雙重解鎖。 為了確保這不是問題,請將Lock類的復制ctor設為私有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM