草庐IT

thread_name

全部标签

c++ - 如何正确退出可能正在等待 std::condition_variable 的 std::thread?

我有一个类使用互斥锁和两个条件变量实现线程化生产者/消费者系统以进行同步。当有元素要使用时,生产者向消费者线程发出信号,而消费者在消费完元素时向生产者线程发出信号。线程继续生产和消费,直到析构函数通过设置bool变量请求它们退出。因为任何一个线程都可能在等待条件变量,所以我必须对quit变量进行第二次检查,这感觉不对而且很乱......我已将问题简化为以下(使用g++4.7在GNU/Linux上工作)示例://C++11andBoostrequired.#include//std::rand()#include#include#include#include#include#inclu

c++ - GCC 4.7.2:带有指向成员函数指针的 std::thread

正在为thisquestion写测试代码我发现下面的注释行无法在GCC4.7.2上编译:#include#includestructS{voidf(){std::cout但cppreference似乎声称“this”参数可以等效地作为对象、对象引用或对象指针传递:IffispointertoamemberfunctionofclassT,thenitiscalled.Thereturnvalueisignored.Effectively,thefollowingcodeisexecuted:(t1.*f)(t2,...,tN)ifthetypeoft1iseitherT,referen

c++ - 多个 std::threads 和主程序执行的问题

几天来,我一直在努力想出一种机制来启动一些计时器,而不是让它为主程序执行计时。.join()和.detach()、wait_until()等的组合我有一个std::thread的vector,我想:执行第一个位置等待它完成执行下一个位置等待它完成与此同时,我的应用程序的其余部分正在运行,用户点击东西等。我想出的一切似乎要么:在计时器运行时阻止主程序运行或从主线程分离,但计时器同时运行,我多么希望在前一个完成后再运行一个。我什至发布了:C++11std::threadsandwaitingforthreadstofinish但我似乎无法理解任何一个解决方案。我应该使用std::launc

C++11 多线程 : State of thread after execution

线程执行完成后的状态是什么?是执行完立即销毁还是随父线程一起销毁? 最佳答案 std::thread对象不同于底层控制线程(尽管它们应该一对一映射)。这种分离非常重要,它意味着std::thread和控制线程可以有不同的生命周期。例如,如果你在堆栈上创建你的std::thread,你真的需要在你的对象被销毁之前调用thread::detach(如果你没有析构函数将调用terminate)。此外,正如Grizzly指出的那样,您可以在对象销毁之前调用.join(),这将阻塞直到线程执行完成。这也回答了您的问题-std::thread对

c++ - 为什么在全局变量的析构函数中调用 thread.join 会失败

我将有问题的代码简化为以下内容。我有一个C类,它在自己的线程上运行一个成员函数。在C的析构函数中,我想干净地退出这个线程。只要c是在main(1)中定义的,它就可以正常工作,但当它是一个全局变量(2)时就不行了。在后一种情况下,我看到线程函数返回但t.join()挂起。#include#include#include#includeusingnamespacestd;classC{public:C(){stop=false;t=thread(&C::ThreadFunc,this);}~C(){stop=true;cv.notify_all();if(t.joinable()){cou

从命令行运行程序时出现 C++ 错误 "failure: locale::facet::_S_create_c_locale name not valid"

我似乎对C++中的区域设置有疑问。当我从Eclipse中运行我的程序时,一切正常。但是,当我尝试从命令行运行时,我不断收到此错误:失败:locale::facet::_S_create_c_locale名称无效这是触发错误的代码://SetupUTF8filestreamstringfileName="./sz.txt";wifstreaminFileStream;try{setlocale(LC_ALL,"");inFileStream.open(fileName.c_str());inFileStream.imbue(locale(""));if(!inFileStream){re

c++ - 如何将可变参数传递给 std::thread?

我想通过包装C++11中的std::thread类来使用我自己的Thread实现,这样我就能够按我想要的方式处理异常。这是我的包装类:#include#include#include#includeclassThread{private:std::exception_ptrexceptionPtr;std::threadthread;public:usingId=std::thread::id;usingNativeHandleType=std::thread::native_handle_type;Thread()noexcept=default;Thread(Thread&&t)n

c++ - 前向声明 : incomplete type 'enums::Category' used in nested name specifier 有问题

我想要一个围绕枚举的包装器,这将使我有机会将其转换为字符串,反之亦然。基类如下:templateclassStringConvertedEnum{public:staticstd::stringtoString(TEnume);staticTEnumtoEnum(std::string&str);protected:staticconststd::map_stringMapping;staticconststd::map_enumMapping;};然后我想要这样的东西:classCategory:publicStringConvertedEnum{public:enumEnum{Ca

c++ - std::thread::join 何时会因 no_such_process 而失败

std::thread::join()允许失败,如果线程“无效”,则为no_such_process抛出std::system_error。请注意,no_such_process情况不同于不可连接的线程(错误代码为invalid_argument)。在什么情况下会发生这种情况?或者,我必须怎么做才能确保join()不会因此而失败?我想要一个析构函数join()它管理的一些线程,当然我希望析构函数永远不会抛出异常。什么可以使(正确构造且未被破坏的)线程“无效”。 最佳答案 Inwhatcircumstancesmightthathap

【LaTeX 问题解决方案】I couldn‘t open file name `.aux‘

最近用vscode的latex插件编译论文的时候发现,编译bibtex时总会报错:Icouldn’topenfilename“.aux”。但是在编译xelatex时发现已经产生了一个aux文件,那么为什么latex插件无法找到aux文件呢?经过一番摸索,我发现问题出现在设置文件中。"latex-workshop.latex.clean.fileTypes":[//"*.aux","*.bbl","*.blg","*.idx","*.ind","*.lof","*.lot","*.out","*.toc","*.acn","*.acr","*.alg","*.glg","*.glo","*.gl