【问题标题】:Segmentation fault: 11 while using boost mutex分段错误:11,而使用升压互斥锁
【发布时间】:2013-10-09 21:27:20
【问题描述】:

我实现了一个基于boost mutex的锁宏,代码如下:

#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();
}

我在 Mac OS 中使用 clang++ -std=c++11 -stdlib=libc++ lock_raii.cc -lboost_system -lboost_thread 编译了它。当我运行它时,有一个Segmentation fault: 11

它有什么问题?

【问题讨论】:

  • 你试过调试了吗?
  • 请不要使用那个宏。太丑了。
  • C++11 提供标准的互斥锁和锁定结构;见lock_guard。你的宏观技巧很聪明,但不是很好的做法。它增加了另一层间接和认知摩擦,几乎没有任何收获。
  • 你有什么理由不使用 C++11 或 boost 中的 lock_guard 吗?我发现这个宏“把戏”特别讨厌......
  • 既然拥有boost::mutex,为什么还要重新发明互斥锁?当您拥有boost::scoped_lock 时,为什么要重新发明一种锁类型?如果您真的想让该宏工作(恕我直言,这是一个坏主意),那么您需要使 Lock 类型可移动(不可复制),并且如果锁的所有权已转移到另一个,则使其无法解锁析构函数中的任何内容对象,那么您可以保证只有一个对象拥有锁,并且只有一个对象会解锁它。

标签: c++ multithreading boost locking


【解决方案1】:

除了这种方法至少有问题之外,我认为代码没有问题。 Linux 上的 gcc v4.7.0 也没有问题(没有分段错误)。因此,您可能无法正确设置 boost 或某处存在错误。您应该在调试器下运行您的程序并查看问题发生在哪里。 理论上这段代码:

if(Lock _lock_=x){}else

可以编译为:

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

并调用复制 ctor 并对互斥锁进行双重解锁。为确保这不是问题,请将 Lock 类的复制 ctor 设为私有。

【讨论】:

  • 如果您将复制构造函数设为私有,则 Lock _lock_=x 格式错误,无法编译。简而言之,设计坏了,解决办法就是改变它。
猜你喜欢
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多