小编Han*_* S.的帖子

在Python中获取对象的完全限定类名

出于日志记录的目的,我想检索Python对象的完全限定类名.(完全限定,我的意思是类名,包括包和模块名.)

我知道x.__class__.__name__,但是有一个简单的方法来获得包和模块吗?

python python-datamodel

125
推荐指数
9
解决办法
7万
查看次数

返回受保护数据时如何使用lock_guard

我有一个关于使用boost::lock_guard(或类似的作用域锁)和使用应该由return语句中的锁保护的变量的问题.

如何破坏本地对象并复制返回值?返回值优化如何影响这一点?

例:

Data Class::GetData()
{
    boost::lock_guard<boost::mutex> lock(this->mMutex);
    return this->mData;
}
Run Code Online (Sandbox Code Playgroud)

这是正确的(如果mData是受mMutex保护的变量)吗?或者我是否必须使用本地范围和临时,如下例所示:

Data Class::GetData()
{
    Data ret;
    {
        boost::lock_guard<boost::mutex> lock(this->mMutex);
        ret = this->mData;
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading locking thread-safety boost-thread

20
推荐指数
1
解决办法
3352
查看次数

头文件中的const变量和静态初始化fiasco

在阅读了很多关于静态变量初始化的问题之后,我仍然不确定它如何适用const于命名空间级别的变量.

我在构建脚本生成的文件中有以下代码config.h:

static const std::string path1 = "/xyz/abc";
static const std::string path2 = "/etc";
Run Code Online (Sandbox Code Playgroud)

根据我所读到的,static关键字是没有必要的,甚至在这里弃用.

我的问题:上面的代码是否容易出现静态初始化惨败?

如果我在文件中有以下内容myclass.h:

class MyClass
{
public:
    MyClass(const std::string& str) : m_str(str) {}
    std::string Get() const { return m_str; }

private:
    std::string m_str;
}

const MyClass myclass1("test");
Run Code Online (Sandbox Code Playgroud)

这会引起静态初始化的任何问题吗?

如果我理解正确,由于const变量具有内部联系,两种情况都应该没有问题?

编辑:(由于运动答案)

也许我应该提一下,我对以下用例感兴趣:

main.cpp:

#include <config.h>
#include <myclass.h>

std::string anotherString(path1 + myclass1.Get());

int main()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

关于这个用例的另一个问题:path2在这种情况下,编译器会优化吗?

c++ initialization linkage

14
推荐指数
3
解决办法
3万
查看次数

每个进程可配置的核心转储目录

有没有办法配置为特定进程放置核心转储文件的目录?

我有一个用C++编写的守护进程,我想为其配置核心转储目录.可选地,文件名模式也应该是可配置的.

我知道/proc/sys/kernel/core_pattern,但这会改变全局的模式和目录结构.

Apache有指令CoreDumpDirectory- 所以它似乎是可能的.

c++ linux debugging coredump

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

成员函数模板是否需要“内联”

如果我在非模板类中有一个成员函数模板,并且想在类外定义它-我是否必须使用“内联”?

例:

class A
{
    template <class D>
    void someMethod(D param);
}

template <class D>
/* inline needed here? */ void A::someMethod(D param)
{
}
Run Code Online (Sandbox Code Playgroud)

该标准的第3.2.5节说功能模板不属于一个定义规则。成员功能模板在这方面是否是功能模板?

编辑:没有内联程序,链接器不会抱怨-但仍然-它是否有效的C ++ 03?

编辑:

到目前为止,我了解到的是:gcc(以及假设的其他编译器)也将隐式模板实例导出为弱符号,这意味着如果在多个转换单元中实例化它们,则链接时间内不会发生冲突。由于弱符号不是标准的一部分-标准是否以某种方式隐式要求模板实例化以这种方式运行,我是否可以期望其他符合标准的编译器/链接器组合具有相同的行为?

由于内嵌基本上忽略了优化,但是允许在不同的翻译单位功能的多个定义,这暗示转化为出口这些功能弱符号。这是否意味着将模板声明为内联是多余的?

c++ templates

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

线程之间的更改通知标志是否需要内存屏障?

我需要一个非常快(在某种意义上"读取器的低成本",而不是"低延迟")线程之间的更改通知机制,以便更新读取缓存:

情况

线程W(Writer)S仅在一段时间内更新数据结构()(在我的情况下是地图中的设置).

线程R(Reader)维护缓存S并且经常读取它.当线程W更新S线程R需要在合理的时间(10-100ms)内通知更新.

架构是ARM,x86和x86_64.我需要支持C++03gcc 4.6及更高版本.

是这样的:

// variables shared between threads
bool updateAvailable;
SomeMutex dataMutex;
std::string myData;

// variables used only in Thread R
std::string myDataCache;

// Thread W
SomeMutex.Lock();
myData = "newData";
updateAvailable = true;
SomeMutex.Unlock();

// Thread R

if(updateAvailable)
{
    SomeMutex.Lock();
    myDataCache = myData;
    updateAvailable = false;
    SomeMutex.Unlock();
}

doSomethingWith(myDataCache);
Run Code Online (Sandbox Code Playgroud)

我的问题

在线程R中,"快速路径"中没有发生锁定或障碍(无可用更新).这是一个错误吗?这个设计有什么后果?

我需要有资格updateAvailablevolatile

最终 …

c++ multithreading lock-free c++03

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

如何选择依赖gcc的共享对象?

首先,我不知道我的问题是否有解决办法.

我有以下情况:

  • 我开发了一个框架库,它依赖于其他几个库来进行特定的硬件访问等.
  • 到目前为止,这个框架库只是静态链接.
  • 对于使用框架库的可执行文件,只需链接可执行文件实际使用的代码的依赖项.(如果我根本不访问特定的硬件,我不必依赖它的相关库.)

现在我还需要创建框架库的共享对象.此外,依赖项可用作共享库,因此不需要任何静态链接.

我现在遇到的问题:

  • 构建动态链接到框架库的应用程序时,我必须将所有依赖项动态链接到框架库或应用程序.(否则我得到来自ld的未定义的引用投诉)

我的问题:

  • 如果我知道我的应用程序不会使用依赖于此共享对象的框架库的任何代码,是否有任何方法可以忽略某些共享对象依赖项?

  • 有没有办法在没有代码更改的情况下执行此操作?(链接器/编译器开关)

我还需要原始情况中描述的静态链接仍然有效.

附加信息:

  • 操作系统:Linux(Debian Lenny)
  • 编译器:gcc-4.3

c++ linker gcc shared-libraries

5
推荐指数
2
解决办法
4367
查看次数

到期后boost :: weak_ptr的排序顺序?

对于boost::weak_ptroperator<定义,使其能够在关联容器中使用.

我的问题是:几个weak_ptr对象的排序顺序是否稳定,即使它们中的一些变为零的引用数量?容器不是那么乱std::set吗?

例:

using namespace boost;
shared_ptr<A> sptrA1(new A);
weak_ptr<A> wptrA1 = sptrA1;
weak_ptr<A> wptrA2;

{ // begin Scope 1
    shared_ptr<A> sptrA2(new A);
    wptrA2 = sptrA2;
    assert(wptrA1 < wptrA2); // assert #1
}
assert(wptrA1 < wptrA2); // assert #2
Run Code Online (Sandbox Code Playgroud)
  • 如果断言#1为真,断言#2总是成立吗?
  • wptrA2范围1之前和之后是否处于相同的状态?

c++ boost boost-smart-ptr

5
推荐指数
1
解决办法
501
查看次数