我有一个使用Boost.Asio进行TCP和UDP套接字通信的应用程序.我知道"Asio"中的"A"代表异步,因此库倾向于鼓励您尽可能使用异步I/O. 我有一些情况下,优选同步套接字读取.但是,与此同时,我想在所述接收调用上设置超时,因此不可能无限期地进行读取阻塞.
这似乎是Boost.Asio用户中一个非常常见的问题,以下是关于该主题的以下Stack Overflow问题:
甚至可能还有更多.文档中甚至有关于如何使用超时实现同步操作的示例.他们归结为将同步操作转换为异步操作,然后与a并行启动asio::deadline_timer.然后,计时器的到期处理程序可以在超时到期时取消异步读取.这看起来像这样(从上面链接的示例中获取的片段):
std::size_t receive(const boost::asio::mutable_buffer& buffer,
boost::posix_time::time_duration timeout, boost::system::error_code& ec)
{
// Set a deadline for the asynchronous operation.
deadline_.expires_from_now(timeout);
// Set up the variables that receive the result of the asynchronous
// operation. The error code is set to would_block to signal that the
// operation is incomplete. Asio guarantees that its asynchronous
// operations will never …Run Code Online (Sandbox Code Playgroud) 我有一个简单的构建系统,用于我使用SCons放在一起的项目.该项目有很多源文件,我认为随着构建的进展,显示某种进度信息对用户友好.SCons提供CXXCOMSTR了我可以覆盖的构造变量,以控制在每个构建步骤期间显示给终端的内容.例如,而不是看到像:
gcc file.c -o file.o
Run Code Online (Sandbox Code Playgroud)
有这样的东西会很高兴:
[1/10] Compiling file.c: `gcc file.c -o file.o`
Run Code Online (Sandbox Code Playgroud)
其中[1/10]指定这是在此构建期间正在更新的十个目标中的第一个.有没有办法访问这些信息,以便我可以生成这样的消息?看起来我需要知道正在更新的目标总数(这是基于SCons所做的依赖性扫描)和一些枚举每个目标的方法.我知道类似的行为类似于其他构建系统,如CMake和waf,但在SCons(扩展)文档中没有遇到过任何问题.
我有一个简单的C++程序,我正在尝试运行,它与我之前构建的Boost.Thread库的版本相关联.我似乎无法理解运行时库路径在OS X上的行为方式.
由于我的Boost库没有与RPATH相关的安装名称,因此我使用DYLD_LIBRARY_PATH环境变量来告诉动态链接器libboost_thread.dylib在运行时的位置.
如果我直接在my(bash)shell中运行程序,这可以正常工作:
[~/git/project]$ echo $DYLD_LIBRARY_PATH
/Users/jasonr/git/project/boost/lib
[~/git/project]$ .sconf_temp/conftest_7
[~/git/project]$ # Program runs successfully; this is what I expect.
Run Code Online (Sandbox Code Playgroud)
但是,这个程序是autoconf我正在使用的类似框架的一系列测试的一部分.它使用子shell运行程序sh -c.如果我尝试这样做会发生什么:
[~/git/project]$ # Make sure the environment variable is exported to child shells.
[~/git/project]$ export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH
[~/git/project]$ # Try to run it in a child shell.
[~/git/project]$ sh -c .sconf_temp/conftest_7
dyld: Library not loaded: libboost_thread.dylib
Referenced from: /Users/jasonr/git/project/.sconf_temp/conftest_7
Reason: image not found
Trace/BPT trap: 5
Run Code Online (Sandbox Code Playgroud)
就像dyld …
我有一个Ubuntu 13.04系统,安装了最新的SVN版本的Boost C++库.Boost安装是使用系统的本机gcc版本v4.7.3构建的.我使用Boost非常广泛,当我使用编译时它非常好用gcc; 我已经使用了很多,包括Boost.Thread(我将在下面详细讨论),没有任何问题.
如果我尝试使用与已安装的Boost库链接的英特尔C++编译器(我个人在v13.x系列中使用了几个不同版本)来构建程序,则会出现问题.当我这样做时,程序启动后立即出现分段故障; 它似乎发生在Boost.Thread库的静态初始化期间.这是一个简单的示例程序:
#include <boost/version.hpp>
#include <boost/thread.hpp>
int main()
{
boost::this_thread::sleep(boost::posix_time::seconds(1));
}
Run Code Online (Sandbox Code Playgroud)
我使用英特尔C++编译它:
icpc test.cc -lboost_thread -lboost_system -I/path/to/boost/inc/dir -L/path/to/boost/lib/dir
Run Code Online (Sandbox Code Playgroud)
正如我所说,当我运行生成的程序时,我得到了近乎立即的段错误.通过gdb,段错误点的堆栈跟踪如下:
#0 0x00007ffff79b6351 in boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>() () from ./libboost_thread.so.1.55.0
#1 0x00007ffff79b02e1 in _GLOBAL__sub_I_thread.cpp () from ./libboost_thread.so.1.55.0
#2 0x00007ffff7de9876 in call_init (l=l@entry=0x7ffff7ff9a10, argc=argc@entry=1,
argv=argv@entry=0x7fffffffe0b8, env=env@entry=0x7fffffffe0c8) at dl-init.c:84
#3 0x00007ffff7de9930 in call_init (env=<optimized out>, argv=<optimized out>,
argc=<optimized out>, l=0x7ffff7ff9a10) at dl-init.c:55
#4 _dl_init (main_map=0x7ffff7ffe268, argc=1, argv=0x7fffffffe0b8, env=0x7fffffffe0c8)
at dl-init.c:133
#5 0x00007ffff7ddb68a in _dl_start_user () …Run Code Online (Sandbox Code Playgroud) 假设我有以下类定义:
template <unsigned int N>
class foo
{
boost::tuples::tuple<...> bar;
};
Run Code Online (Sandbox Code Playgroud)
给定编译时常量N,我想将类型扩展为bar包含N指定类型元素的元组.也就是说,类型foo<2>::bar会boost::tuples::tuple<T, T>.我猜我可以使用Boost.MPL,但我还没有想出确切的序列.我想我能做到:
template <typename T, int N>
struct type_repeater
{
typedef typename boost::mpl::fold<
boost::mpl::range_c<T, 0, N>,
boost::mpl::vector<>,
boost::mpl::push_back<_1, T>
>::type type;
};
Run Code Online (Sandbox Code Playgroud)
所以那么例如type_repeater<T, 2>::type相当于boost::mpl::vector<T, T>.我只是不确定如何/如果我可以采取该类型列表并将其注入元组的参数列表,就像我想要的那样.这可能吗?
我正在使用C intrinsics为英特尔的AVX指令编写代码.如果我有一个打包的双向量(a __m256d),那么将它们中的每一个存储到内存中的不同位置的最有效方式(即操作次数最少)(即我需要将它们扇出到不同的位置,以便他们不再被包装)?伪代码:
__m256d *src;
double *dst;
int dst_dist;
dst[0] = src[0];
dst[dst_dist] = src[1];
dst[2 * dst_dist] = src[2];
dst[3 * dst_dist] = src[3];
Run Code Online (Sandbox Code Playgroud)
使用SSE,我可以__m128使用_mm_storel_pi和_mm_storeh_piintrinsics 使用类型.我无法找到任何类似的AVX,允许我将各个64位存储器存储到内存中.有人存在吗?
我有一些代码产生了一个pthread试图维持与远程主机的套接字连接的代码.如果连接丢失,它会尝试使用connect()其套接字上的阻塞调用重新连接.由于代码在一个单独的线程中运行,我并不真正关心它使用同步套接字API的事实.
也就是说,直到我的应用程序退出时.我想执行一些有序关闭的外观,所以我使用线程同步原语唤醒线程并发出信号让它退出,然后pthread_join()在线程上执行一个等待它完成.这很好用,除非connect()在我命令关闭时线程处于调用的中间.在这种情况下,我必须等待连接超时,这可能需要很长时间.这使得应用程序似乎需要很长时间才能关闭.
我想做的是以connect()某种方式中断呼叫.调用返回后,线程会注意到我的退出信号并干净地关闭.由于connect()是系统调用,我认为我可能会故意使用信号中断它(从而使调用返回EINTR),但我不确定这是否是POSIX线程环境中的健壮方法.
有没有人建议如何使用信号或通过其他方法?请注意,connect()我无法修改某些库代码中的调用,因此不能选择更改为非阻塞套接字.
我有一个foo()在库上下文中提供的函数.该库为此函数定义了一些重载,如:
char foo(float x, int y);
short foo(double x, char y);
Run Code Online (Sandbox Code Playgroud)
(我做了上面的参数/结果类型.要点是参数类型和重载的相应返回类型之间没有通用关系.)
这个想法是库用户可以foo()根据需要为他们自己的用户定义类型添加重载.函数重载非常容易实现.
我想foo()在Boost.Proto表达式中使函数族可用.为了做到这一点,我想我需要使用模板调用操作符将上面的内容包装在一个函数对象中:
struct foo_wrap
{
template <typename A1, typename A2>
result_type operator()(A1 a1, A2 a2) { return foo(a1, a2); }
};
Run Code Online (Sandbox Code Playgroud)
问题在于如何定义result_type.我意识到使用C++ 11和decltype()尾随函数返回类型会很容易,但我正在寻找一个C++ 03解决方案.因此,foo_wrap需要成为TR1风格的函数对象.我需要找到一种方式来定义result_type的参数类型的编译时的功能A1和A2.这不仅需要返回类型operator(),还需要TR1 result_of协议.简而言之:
我对constexpr编程比较陌生,正在尝试string_view在constexpr上下文中对对象进行一些基本操作。就我而言,所有字符串在我的源代码中都以文字开头,因此它们似乎应该是常量表达式。我发现我可以constexpr string_view从字符串文字构造 a ,没有任何问题。
但是,如果我尝试调用一个采用字符串文字作为参数的constexpr函数,则编译会失败。string_view请参阅以下示例(编译器资源管理器链接):
#include <string_view>
// this doesn't compile; the compiler complains that `sv` is not a constant-expression
constexpr bool foo(std::string_view sv)
{
constexpr auto it = sv.find('b');
return it != sv.end();
}
// this compiles just fine, though
constexpr std::string_view bar("def");
int main()
{
foo("abc");
}
Run Code Online (Sandbox Code Playgroud)
gcc 8.3 提供以下错误:
<source>: In function 'constexpr bool foo(std::string_view)':
<source>:5:32: in 'constexpr' expansion of 'sv.std::basic_string_view<char>::find(((int)'b'), 0)'
<source>:5:36: …Run Code Online (Sandbox Code Playgroud) 我不确定我是否以最有效的方式提出这个问题,但我现在才开始使用C++ 11,并且无法将新功能应用于手头的问题.我有以下概念功能:
template <typename ... Args>
std::vector<std::type_index> foo()
Run Code Online (Sandbox Code Playgroud)
我想foo()返回一个vector包含type_index参数包中每个类型的值的值Args.例如,foo<int, vector<int>, double>()将返回一个vector包含{ type_index(typeid(int)), type_index(typeid(vector<int>)), type_index(typeid(double)) }.
从理论上讲,我想迭代包中的类型并在每个类型上调用上面的转换(即给出一个类型T,返回type_index(typeid(T)).我觉得应该有一个干净的方法来实现这一点,但我不清楚如何操作可变模板机器来完成这项工作.我的直觉是否正确?