小编Dmi*_*kov的帖子

在类中使用静态互斥锁

我有一个课,我可以有很多实例.在里面它创建并初始化来自第三方库(使用一些全局变量)的一些成员,并且不是线程安全的.

我想过使用静态boost :: mutex,它将被锁定在我的类构造函数和析构函数中.因此,在我的线程中创建和销毁实例对第三方成员来说是安全的.



class MyClass

{
  static boost::mutex mx;

  // 3rd party library members
public:
  MyClass();
  ~MyClass();
};

MyClass::MyClass()
{
  boost::mutex::scoped_lock scoped_lock(mx);
  // create and init 3rd party library stuff
}

MyClass::~MyClass()
{
  boost::mutex::scoped_lock scoped_lock(mx);
  // destroy 3rd party library stuff
}


我无法链接,因为我收到错误:

undefined reference to `MyClass::mx`
Run Code Online (Sandbox Code Playgroud)
  1. 我需要对这种静态成员进行一些特殊的初始化吗?

  2. 使用静态互斥锁有什么不对吗?


编辑: 链接问题已在cpp中使用正确的定义修复

boost::mutex MyClass::mx;
Run Code Online (Sandbox Code Playgroud)

c++ linux multithreading boost

31
推荐指数
1
解决办法
4万
查看次数

SVN:将本地更改合并到其他工作副本中

我有两个相同项目的工作副本,每个副本都切换到另一个分支.是否可以将一个项目中的本地更改合并到另一个工作副本?

svn windows merge working-copy

13
推荐指数
1
解决办法
2万
查看次数

更改类私有数据成员的顺序是否会破坏ABI

我有一个包含多个私有数据成员的类(其中一些是静态的),由虚拟和非虚拟成员函数访问.没有内联函数,也没有朋友类.

class A
{
    int number;
    string str;
    static const int static_const_number;
    bool b;
public:
    A();
    virtual ~A();
public:
    // got virtual and non-virtual functions, working with these memebers
    virtual void func1();
    void func2();

    // no inline functions or friends
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,更改私有数据成员的顺序是否会破坏ABI?

class A
{
    string str;
    static const int static_const_number;
    int number; // <--   integer member moved here
    bool b;
    ...
};
Run Code Online (Sandbox Code Playgroud)


编辑
类型不会更改,只会更改成员的顺序.也没有使用位标志.代码用作共享库,没有静态链接到此代码.我在Linux上,编译器是gcc-3.4.3和gcc-4.1

c++ linux gcc shared-libraries binary-compatibility

9
推荐指数
2
解决办法
633
查看次数

RPM包中的几个组

单个rpm包是否可以属于多个组?

在spec文件中,您可以设置包组:

组:系统环境/基础

我需要的是能够为这个包设置几个组(比如System|Util|MyCompanyName) - 它们就像分配给包的标签一样.

安装包时我想查询它

rpm -q --group System
Run Code Online (Sandbox Code Playgroud)

要么

rpm -q --group MyCompanyName
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我都应该看到我的包裹(以及属于这个群体的其他人)


编辑:

许多软件包可能属于MyCompanyName组,但只能安装少数软件包.我需要一种方法来区分我们的软件包和Linux系统软件包 - 我打算用组名来做


我尝试了几Group:行,但它只使用了最后一行.之后的所有内容Group:似乎都被视为一个字符串,我无法找到分裂它们的方法.

我能想到的另一个解决方案就是把这些东西放进PROVIDES去查询

rpm -q --whatprovides System
Run Code Online (Sandbox Code Playgroud)

但我不喜欢这样.

还有其他方法可以完成所请求的功能吗?

linux packaging packages rpm rpmbuild

8
推荐指数
1
解决办法
2933
查看次数

两个线程同时中止()

我有一些我以前从未见过的回溯.请参见以下主题中的第2帧:

Thread 31 (process 8752):
#0  0x00faa410 in __kernel_vsyscall ()
#1  0x00b0b139 in sigprocmask () from /lib/libc.so.6
#2  0x00b0c7a2 in abort () from /lib/libc.so.6
#3  0x00752aa0 in __gnu_cxx::__verbose_terminate_handler () from /usr/lib/libstdc++.so.6
#4  0x00750505 in ?? () from /usr/lib/libstdc++.so.6
#5  0x00750542 in std::terminate () from /usr/lib/libstdc++.so.6
#6  0x00750c65 in __cxa_pure_virtual () from /usr/lib/libstdc++.so.6
#7  0x00299c63 in ApplicationFunction()

Thread 1 (process 8749):
#0  0x00faa410 in __kernel_vsyscall ()
#1  0x00b0ad80 in raise () from /lib/libc.so.6
#2  0x00b0c691 in abort () from /lib/libc.so.6
#3 …
Run Code Online (Sandbox Code Playgroud)

c c++ linux crash multithreading

7
推荐指数
1
解决办法
1711
查看次数

适用于Linux的C++ IDE,具有智能参考搜索功能

有没有一个IDE支持C++,真的很容易搜索引用?"引用"是指在整个Project或Workspace中使用类(或其成员),变量,函数.

有很多IDE提供它.其中一些似乎只是搜索具有相同名称的文本提供了大量的东西,其他更聪明并检查上下文(如类边界,命名空间)但不够准确.

到目前为止我尝试过的最好的是Visual SlickEdit,但还有更多希望.

class C1
{
    int foo;
};
class C2
{
    int foo;
};
Run Code Online (Sandbox Code Playgroud)

例如,在这种情况下搜索C1::foo引用时我也不想C2::foo显示.

那么,有一个IDE会如此聪明吗?

EDIT2

到目前为止,每个人都有10倍的答案.

我尝试过Eclipse,引用搜索似乎相对较好,但它需要20分钟来索引中等大小的项目,并且需要4次5才能耗尽内存和崩溃.我尝试增加它和其他一些建议,它有一点好转,但仍然非常慢和烦恼与这些崩溃.

我试过KDevelop3,但这个问题中提到的功能不是很先进 - 似乎只是非常先进grep的文本搜索.

Edit4

KDevelop4 - 我试图让它工作,但是最新的beta它对于自定义makefile项目来说是无法使用的,我无法用它做任何事情.

编辑5
我很惊讶,但QT Creator在我的测试中表现得非常好.它似乎没有创建一些标记/索引文件,但以某种方式设法非常精确地显示变量/函数/类的用法.不幸的是,当遵循函数定义时,模板似乎无法正常工作.

所提到的IDE都不能与Visual SlickEdit竞争使用引用,虚函数等.QT Creator是最接近的,所以我会选择它作为我的问题的答案.

c++ linux ide

6
推荐指数
1
解决办法
1175
查看次数

多线程应用程序的核心转储只显示一个线程

我在c ++中有一个测试应用程序,在其中启动了几个线程main(),然后main()永远沉睡.

其中一个线程正在做一些导致段错误的事情,并且生成了一个coredump(之前设置了ulimit -c unlimited).

我打开核心gdb并看到thread apply all bt或者info threads我只有一个线程(启动main()),这是不可能的,因为至少main()线程也应该运行.

问题是如何丢失其余的线程以及可能导致它的原因?

这个孤独的线程的回溯似乎没问题,其中没有什么奇怪的东西.

操作系统是Red Hat Enterprise 5.3,gdb-6.8.

linux multithreading gdb

6
推荐指数
1
解决办法
8910
查看次数