单线程共享指针,适用于大型项目中的简单包含

26 浏览
0 Comments

单线程共享指针,适用于大型项目中的简单包含

我正在编写一段多平台的C++代码,我需要一个共享指针。目前项目不使用boost,从管理角度来说,引入boost将非常困难甚至不可能。然而,我可以使用C++11的一些特性,包括共享指针。\n标准的共享指针存在一个问题,它们保证线程安全。这意味着在某些平台/编译器上,比如GCC(http://tinyurl.com/GCCSharedPtrLockPolicy),原子操作和互斥锁会被无谓地使用,但至少我可以检查和解决由此引起的问题。然而,在其他平台上(http://tinyurl.com/msvscSharedPtr),似乎没有办法检查使用了哪些线程安全机制。原始的boost指针只提供了最基本的线程安全保证(http://tinyurl.com/SharedPtrThreadSafety)。\n我的核心问题是,在某些平台上,原子操作可能导致CPU缓存之间的昂贵同步,而不必要的互斥锁可能导致调用操作系统,这可能会由于不完全相关的原因导致延迟。这段代码将是多线程的,但我们有其他的同步方法来在线程之间传递数据。一个线程安全的共享指针根本不需要或不希望。\n通常情况下,我更喜欢进行基准测试并做出决策,但由于该代码将在运行和移植到的平台上,我无法实际进行测试。我需要在一些不太流行的平台上进行测试,那里存在着不太优化的编译器,但我目前没有这个能力。\n我将努力推动获取Boost指针,但这是不太可能的,如果失败了,我还有其他选择吗?与此同时,我将研究如何从boost中提取Shared_ptr,但我认为这不会容易。\n我可以自己实现。这似乎是一个糟糕的主意,为什么我要重新发明这么基础的东西。\n如果有一个简单并且具有足够宽松许可的库,那么我可以简单地复制他们的shared_ptr代码,并简化自己实现的过程。\n编辑:除了头文件库之外,从boost引入任何东西都已被取消。我将研究Loki,正如其中一位回答者建议的那样。如果那也失败了,且这里没有出现其他答案,我将自己实现 :(。

0
0 Comments

在大型项目中,有一个问题是需要在单线程中共享指针。这个问题的出现是因为在gcc中有一个名为`__shared_ptr`的类,它采用了锁策略,`shared_ptr`是其派生类。其中之一的策略是`_S_single`,适用于单线程代码(即非锁定/非原子引用计数)。在C++11中,可以使用模板别名来使用非标准的`__shared_ptr`类,`shared_ptr`是它的派生类。如果还没有符合标准的编译器,可以通过继承`__shared_ptr`并公开接口来自定义。在gcc中就是这样做的,因为在4.7之前还没有模板别名的功能。在`bits/shared_ptr.h`中查看`shared_ptr`如何派生自`__shared_ptr`,很容易自定义。然而,这个建议对于GCC来说是很棒的(有一个upvote),但是这段代码必须在其他编译器上编译,目前是Clang和MSVC,但我们很快会迁移到其他编译器。从更一般的意义上说,我考虑过通过“正确”的方式来调整锁策略,即使这样做了,也不明显如何在其他编译器上进行更改。即使我们在每个编译器上都进行了更改,但当我们确实需要一个线程安全的shared_ptr时,我们会怎么办呢?需要注意的是,在GCC 4.9之前(尚未发布),`st_ptr`别名在多线程程序中仍然使用原子操作,详情请参见stackoverflow.com/a/15141844/981959

0
0 Comments

单线程共享指针的出现原因是因为Boost shared_ptr支持单线程使用。然而,在某些项目中,由于项目管理等原因,无法使用Boost库。在这种情况下,可以通过在项目范围内定义宏BOOST_SP_DISABLE_THREADS来切换到普通的非原子引用计数更新,从而实现单线程共享指针的功能。

在这段对话中,某些情况下在使用Boost库时遇到了一些问题。他在一个遗留的clearcase vob中添加了Boost库,但由于Boost库的文件结构较为复杂,需要包含多个文件和文件夹,而且这些文件和文件夹中又包含了其他不必要的Boost项,这给他带来了困扰。他还提到自己曾经为一个项目编写了一个自己的智能指针实现,因此他认为这也是一个解决办法。

最后,有人建议将对话内容整理成一个回答,并指出尽管他的共享指针实现不是基于Boost的,但他的实现作为一个起点可以满足项目的需求,并表示可能会在未来完善该实现。

单线程共享指针的出现原因是在某些项目中无法使用Boost shared_ptr库。解决方法是通过定义宏BOOST_SP_DISABLE_THREADS来切换到普通的非原子引用计数更新,并可以考虑使用自己实现的智能指针。

0
0 Comments

在一个大型项目中,出现了单线程共享指针的问题。为了解决这个问题,可以参考Loki库中的实现。Loki库比Boost库要小得多,而且Loki库中的智能指针实现是高度可配置的。所以,我们可以先看一下Loki库中的实现,然后再进行评价。

0