我使用的是C ++ OpenCL包装程序,我想知道为什么我的程序崩溃了。我发现对的任何调用std::call_once
均引发错误。
#include <mutex>
int main() {
static std::once_flag f;
std::call_once(f, []{});
}
程序输出:
terminate called after throwing an instance of 'std::system_error' what(): Unknown error -1
这是的输出g++ -v
:
Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/8.1.1/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: /build/gcc/src/gcc/configure --prefix=/usr
–libdir=/usr/lib –libexecdir=/usr/lib –mandir=/usr/share/man
–infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/
–enable-languages=c,c ,ada,fortran,go,lto,objc,obj-c –enable-shared
–enable-threads=posix –enable-libmpx –with-system-zlib –with-isl
–enable-__cxa_atexit –disable-libunwind-exceptions –enable-clocale=gnu
–disable-libstdcxx-pch –disable-libssp –enable-gnu-unique-object
–enable-linker-build-id –enable-lto –enable-plugin –enable-install-
libiberty –with-linker-hash-style=gnu –enable-gnu-indirect-function
–enable-multilib –disable-werror –enable-checking=release –enable-
default-pie –enable-default-ssp
Thread model: posix
gcc version 8.1.1 20180531 (GCC)
正如Praetorian在评论中所说,std::call_once
需要调用系统线程库。更具体地说,它将调用__gthread_once
。如果可执行文件未链接到pthread,则该函数将返回-1
,然后将引发异常。
要制作程序-pthread
,必须将启用了pthread的选项同时传递给编译器和链接器,如gcc文档中所述。-lpthread
有时仅通过链接是不够的,不仅仅是因为附加宏。对于CMake用户,有一个现成的模块,可以帮助添加对pthread(或任何系统线程库)的支持,该支持可以这样使用:
find_package(Threads REQUIRED)
target_link_libraries(myTarget PRIVATE Threads::Threads)
如有必要,这将添加所有必需的编译和链接标志。
我有一个Visual Studio 2008 C++03应用程序,使用在Windows XP SP3中运行的Boost 1.47.0。 调用引发异常。 在“输出”窗口中,我看到一条调试堆消息:“heap[test.exe]:无效的分配大小-CDCDCDCE(超出7FFDEFFF)” callstack显示boost.filesystem正在创建一个新的区域设置和Microsoft标准库文件xloc
我在尝试用std::function和std::bind绑定方法时遇到了一个问题。 在我的通信服务类中: CommunicationService::ManageGetRequest签名: BindGET签名: 请求函数类型定义: BindGET上的错误: 错误C2664:“void RESTServer::BindGET(RequestFunction)”:无法从“std::\u Binder”
问题内容: 这不是一个重复的问题,因为提出的解决方案不适用于我的编译器。我正在尝试从该问题编译并运行以下示例。 我已尝试使用该原始问题以及对此重复项目的公认答案中提供的解决方案。但是,尽管我尝试了所有列出的组合,特别是尝试了 当我运行生成的可执行文件时,我仍然得到 这是的输出。 我需要使用其他顺序或命令集吗? 问题答案: 这是在这里回答
当我运行以下代码时, 抛出。但是,当我在另一个线程中设置Promission的值时, 一切正常。根据我对的理解,调用不应该抛出异常,除非promise没有共享状态(即它已从其中移动)或已经为其赋值,即使这样,它也会抛出,而不是。由于不存在数据竞争或任何类似的情况,因此无论我是从创建promise的线程还是在另一个线程中调用都不重要。是不是我漏了什么? 我使用g++和clang都尝试了这一点,结果是
我在理解条件变量及其在互斥体中的使用时遇到了一些困难,我希望社区能帮助我。请注意,我来自win32背景,因此与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。 这是我第一次尝试使用C++11标准库进行并发操作,它是在这里找到的一个程序示例的修改版本。 关于这个的几个问题。 我读过“任何要等待std::condition_var
并行开发挺复杂的,特别是在试图用好线程和锁的过程中。如果要用到条件变量或std-atomics(一种无锁开发方式),那就更复杂了。C++0x提供了future和promise来简化任务线程间的返回值操作;同时为启动任务线程提供了packaged_task以方便操作。其中的关键点是允许2个任务间使用无(显式)锁的方式进行值传递;标准库帮你高效的做好这些了。基本思路很简单:当一个任务需要向父线程(启动