我有一个课,我可以有很多实例.在里面它创建并初始化来自第三方库(使用一些全局变量)的一些成员,并且不是线程安全的.
我想过使用静态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)
我需要对这种静态成员进行一些特殊的初始化吗?
使用静态互斥锁有什么不对吗?
编辑: 链接问题已在cpp中使用正确的定义修复
boost::mutex MyClass::mx;
Run Code Online (Sandbox Code Playgroud) 我有两个相同项目的工作副本,每个副本都切换到另一个分支.是否可以将一个项目中的本地更改合并到另一个工作副本?
我有一个包含多个私有数据成员的类(其中一些是静态的),由虚拟和非虚拟成员函数访问.没有内联函数,也没有朋友类.
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
单个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)
但我不喜欢这样.
还有其他方法可以完成所请求的功能吗?
我有一些我以前从未见过的回溯.请参见以下主题中的第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) 有没有一个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 ++中有一个测试应用程序,在其中启动了几个线程main()
,然后main()
永远沉睡.
其中一个线程正在做一些导致段错误的事情,并且生成了一个coredump(之前设置了ulimit -c unlimited).
我打开核心gdb
并看到thread apply all bt
或者info threads
我只有一个线程(启动main()
),这是不可能的,因为至少main()
线程也应该运行.
问题是如何丢失其余的线程以及可能导致它的原因?
这个孤独的线程的回溯似乎没问题,其中没有什么奇怪的东西.
操作系统是Red Hat Enterprise 5.3,gdb-6.8.