小编Ral*_*ang的帖子

C++ 11中的局部静态变量初始化是否是线程安全的?

我知道这是一个经常被问到的问题,但由于有很多变种,我想重新陈述它,并希望有一个反映当前状态的答案.就像是

Logger& g_logger() {
    static Logger lg;
    return lg;
}
Run Code Online (Sandbox Code Playgroud)

变量lg的构造函数是否保证只运行一次?

我从以前的答案中知道,在C++ 03中,这不是; 在C++ 0x草案中,这是强制执行的.但我想要一个更明确的答案

  1. 在C++ 11标准(非草稿)中,线程安全的初始化行为是否已完成?
  2. 如果以上是肯定的,那么在当前最新版本的热门编译器中,即gcc 4.7,vc 2011和clang 3.0,它们是否正确实施?

c++ thread-safety c++11

198
推荐指数
2
解决办法
6万
查看次数

有关使用CMK/CDash的gcov的详细指南?

我在我的项目中使用CMake并设置了一个用于连续/夜间构建的cdash服务器.一切运作良好,通过设置crontab,我们将每小时/每晚的构建/测试结果自动上传到我们的cdash服务器.

我的下一步是将测试覆盖率报告添加到构建中.我在http://www.cmake.org/Wiki/CTest:Coverage找到了这份文件,但坦率地说,它与实用指南相差甚远.

目前我已经添加了所需的标志(而不是-fprofile-arcs -ftest-coverage,我发现--coverage更好),编译过程生成.gcno文件.但后来我被卡住了.命令

make NightlyCoverage
Run Code Online (Sandbox Code Playgroud)

好像什么也没做.谁能告诉我接下来要做什么?我想要的结果是make NightlyCoverage,生成覆盖率报告并上传到cdash服务器.

c++ testing code-coverage cmake cdash

48
推荐指数
4
解决办法
2万
查看次数

如何使模板右值引用参数仅绑定到右值引用?

我正在编写一个网络库,并大量使用移动语义来处理文件描述符的所有权.我的一个类希望接收其他类型的文件描述符包装并取得所有权,所以就像这样

struct OwnershipReceiver
{
  template <typename T>
  void receive_ownership(T&& t)
  {
     // taking file descriptor of t, and clear t
  }
};
Run Code Online (Sandbox Code Playgroud)

它必须处理多个不相关的类型,所以receive_ownership必须是一个模板,为了安全起见,我希望它只绑定到右值引用,这样用户在传递左值时必须显式地声明std :: move.

receive_ownership(std::move(some_lvalue));

但问题是:C++模板推导允许在没有额外努力的情况下传递左值.我实际上是因为不小心将左值传递给receive_ownership并且稍后使用了左值(清除)而将自己击中一只脚.

所以这是一个问题:如何使模板仅绑定到右值参考?

c++ rvalue-reference

32
推荐指数
3
解决办法
5138
查看次数

C++异常会因内联而停止运行吗?

假设我有一个非常简单的函数,我希望编译器能够内联它.但是我可能需要在看到一些无效输入时抛出异常,是否会阻止编译器内联函数?

c++ inline exception

12
推荐指数
2
解决办法
1393
查看次数

作为模板参数,加上可变参数模板参数

我正在编写一个通用函数包装器,它可以将任何函数包装到具有该形式的lua样式调用中

int lua_function(lua_State*L)

我希望包装函数是即时生成的,所以我想将函数作为模板参数传递.如果你知道参数的数量(例如2),这是微不足道的:

template <typename R, typename Arg1, typename Arg2, R F(Arg1, Args)>
struct wrapper
Run Code Online (Sandbox Code Playgroud)

但是,我不知道这个数字,所以我请求variadic模板参数求助

// This won't work
template <typename R, typename... Args, R F(Args...)>
struct wrapper
Run Code Online (Sandbox Code Playgroud)

上面的内容不会编译,因为variadic参数必须是最后一个.所以我使用两个级别的模板,外部模板捕获类型,内部模板捕获函数:

template <typename R, typename... Args>
struct func_type<R(Args...)>
{
  // Inner function wrapper take the function pointer as a template argument
  template <R F(Args...)>
  struct func
  {
    static int call( lua_State *L )
    {
      // extract arguments from L
      F(/*arguments*/);
      return 1;
    }
  };
};
Run Code Online (Sandbox Code Playgroud)

这是有效的,除了包装像这样的函数

double sin(double d) {} …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

11
推荐指数
1
解决办法
4880
查看次数

在std :: function中存储不可复制但可移动的对象

假设我有一个functor s,它是不可复制但可移动的,我怎样才能将它存储在std :: function中?即,如何编译以下代码?(使用gcc 4.6)

#include <functional>
#include <iostream>

struct S
{
  S() = default;
  S(S const&) = delete;
  S& operator=(S const&) = delete;
  S(S&&) { }
  void operator()() { }
};

std::function<void()> func;

void make_func()
{
  S s;
  func = std::bind(std::move(s));  // This won't compile
}

int main()
{
  make_func();
}
Run Code Online (Sandbox Code Playgroud)

c++

11
推荐指数
1
解决办法
2177
查看次数

64位Linux上的文件描述符范围是什么?

我正在使用epoll_wait编写一个程序来等待64位Linux上的文件描述符,并且我尝试将一些信息与文件描述符一起放在epoll_event用户数据中.

我知道实际上文件描述符不可能超过32位.只是想知道内核是否保证文件描述符具有特定的范围,或者它只是从小数量计算并且不太可能变得非常大?

c linux

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

clang 3.6倍表达左/右

我正在使用clang 3.6' - std = c ++ 1z'来尝试折叠表达式,但是我不太了解.我正在测试的功能是:

auto minus = [](auto... args) { return (args - ...); };
...
std::cout << minus(10, 3, 2) << std::endl;
Run Code Online (Sandbox Code Playgroud)

根据n4191,我期待它作为左折叠扩展

(10 - 3) - 2
Run Code Online (Sandbox Code Playgroud)

然而,给出结果5,结果是9,这似乎是正确的折叠扩展,即

10 - (3 - 2)
Run Code Online (Sandbox Code Playgroud)

我错过了什么或误解了n4191吗?谢谢

c++ clang clang++ c++17

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

程序如何检测它是否作为 systemd 守护进程运行?

有什么方法可以检测程序是否由 systemd 作为守护进程运行?

系统API

sd_booted()
Run Code Online (Sandbox Code Playgroud)

用于检测整个系统是否由 systemd 启动,但没有提及程序本身。

谢谢

linux systemd

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

clang 3.0 + libc ++中的std :: async不起作用?

我刚刚在我的ubuntu 10.04上编译并安装了clang + llvm 3.0,以及来自svn的libc ++.由于libc ++中的状态显示线程支持已完成,我想尝试std :: async.所以我按照Anthony Williams给出的例子

http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html

只需做一些小改动就可以编译:

#include <future>
#include <iostream>

int calculate_the_answer_to_LtUaE()
{
  return 42;
}

void do_stuff()
{
  std::cout << "doing stuff" << std::endl;
}

int main()
{
  std::future<int> the_answer=std::async(calculate_the_answer_to_LtUaE);
  do_stuff();
  std::cout<<"The answer to life, the universe and everything is "
    <<the_answer.get()<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我编译

clang ++ --std = c ++ 0x -stdlib = libc ++ -lpthread async.cpp

但是,它运行并始终以核心转储结束:

做东西生命的答案,宇宙和一切都被中止(核心倾倒)

我检查核心转储,它显示这样的堆栈(我没有得到一个提示)

#0  0x00007fd0a1a7ba75 in raise () from /lib/libc.so.6
#1  0x00007fd0a1a7f5c0 in abort () from …

c++ multithreading clang c++11 libc++

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