草庐IT

Multithreading

全部标签

c++ - memory_order_seq_cst 如何与非原子操作同步?

如果使用单个原子变量和std::memory_order_seq_cst,是否保证非原子操作不会被重新排序?例如,如果我有std::atomicquux={false};voidfoo(){bar();quux.store(true,std::memory_order_seq_cst);moo();}是bar()保证在调用store之后不会重新排序,并且moo()在调用之前不会重新排序store,只要我使用std::memory_order_seq_cst,至少从另一个线程的角度来看?或者,换句话说,如果从另一个线程运行,以下假设是否有效?if(quux.load(std::memor

c++ - 在主程序退出期间销毁等待 std::condition_variable 的线程的正确方法

我正在使用std::conditional_variable为多线程程序中的信号计时,以控制各个关键部分的流程。该程序可以运行,但在退出期间我不得不使用谓词(kill_==true)来避免破坏仍在等待std::conditional_variable::wait()的线程。我不知道它是否是销毁所有等待线程的正确方法,征求意见。这是一个代码片段:classtimer{//...timer(std::shared_ptrparent,constbool&kill):parent_(parent),kill_(kill){}private:std::condition_variablecv_

c++ - 在实践现代 c++17 最佳实践的同时管理线程

本来我想设计一个ThreadManager要存储的类threads连同datatypeobjects和functiontypeobjects他们将与之合作。该类负责管理标准多线程库中关联类型的内存、访问、传输、释放、锁定、解锁、连接和其他典型的通用功能。它最初旨在将包含线程及其ID与特定线程有权访问的一组特定资源相关联。阅读完cppreference上的文档后关于mutex,shared_mutex,lock_guard,shared_lock,std::function等,现在知道mutexes和lock_guards是不可复制的,而且如果我将类模板化以存储任意functionobj

c++ - std::unordered_map:多线程插入?

我有一堆数据(一个巨大的0到ULLONG_MAX之间的整数列表),我想提取所有唯一值。我的方法是创建一个unordered_map,使用整数列表值作为键,使用一次性bool值作为映射值。我迭代列表并为每个键插入一次性值。最后,我迭代map以获取所有唯一键。非常简单。但是,我的列表非常大(数以亿计),我想对这个进程进行多线程处理。我知道一种天真的线程方法是行不通的,因为unordered_map插入会影响底层数据结构,因此它不是线程安全的。并且在每次插入周围添加锁会很慢,并且可能会抵消任何线程加速。然而,大概不是每次插入都会改变数据结构(只有那些不能适应现有分配桶的插入?)。有没有办法在

c++ - 如何修复从 poco 库收到的异常?

当客户端在SenderThread上创建一个即时消息时。它可以来回发送数据。但是当客户端进入挂起模式并从挂起状态返回时。最后创建的线程在恢复。并且没有数据被发送。收到异常详细信息:displayText=Exceptionmessage=name=ExceptionclassName=N4Poco9ExceptionE代码如下:classSenderThread:publicPoco::Runnable{public:MyThread(conststd::string&msg):Msg(msg);{}voidrun(){try{SendData(msg);}catch(Exceptio

c++ - 控制台菜单更新 OpenGL 窗口

我正在制作一个应用程序来进行一些自定义图像处理。该程序将由控制台中的一个简单菜单驱动。用户将输入图像的文件名,该图像将使用openGL在窗口中显示。当用户选择要对图像进行某些处理时,处理完成,openGL窗口应该重新绘制图像。我的问题是我的图像从来没有绘制到窗口,而是窗口始终是黑色的。我认为这可能与我在程序中组织线程的方式有关。主执行线程处理菜单输入/输出和图像处理并调用Display方法,而第二个线程运行openGL主循环。这是我的主要代码:#include#include#include"ImageProcessor.h"#include"BitmapImage.h"usingna

C++: 跨线程异常处理问题与 boost::exception

基本上,我遇到过这样一种情况:一个线程抛出异常,而另一个线程需要处理该异常。我正在尝试使用boost异常来执行此操作,但是异常丢失了它的类型,因此没有被catchblock捕获。基本上,线程B想要做某事,但是由于各种原因,它必须由线程A完成(如果您想知道这些原因,请询问MS为什么direct3d9设备必须由与它相同的线程创建、重置和释放创建窗口)。如果在执行这些操作时发生异常,线程A会捕获它,将其传递回线程B,然后线程B重新抛出它以根据需要进行处理。问题是线程B中抛出的异常似乎与线程A中抛出的异常不同。:(我程序的调试输出和代码如下。First-chanceexceptionat0x7

c++ - boost 线程,测试线程是否准备好加入

我想知道是否有一种方法可以在线程完成执行并等待加入时进行测试。我的猜测是使用time_join。有没有明确的方法来测试它? 最佳答案 boost::thread中没有相应的API。我认为原因是线程可以分离并且不-joinable.您最好的办法可能是包装器和标志。 关于c++-boost线程,测试线程是否准备好加入,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2657100/

c++ - 多生产者单消费者队列

我是多线程的新手,我设计了一个程序,它从两个测量不同温度(环境温度和水)的微Controller接收数据,并将数据绘制到屏幕上。现在这个程序是单线程的,它的性能非常糟糕。我了解了多线程的基本设计方法,但还不足以创建线程来执行任务,但我没有了解的是如何让线程执行单独的任务并将数据放入共享数据池。我认为我需要创建一个具有一个消费者和多个生产者的队列(想使用std::queue)。我在gtkmm线程文档上看到了一些代码,这些代码显示了单个Con/Pro队列,它们会锁定队列对象生成数据并向sleep线程发出信号,表明它已完成,然后生产者将进入休眠状态。对于我需要的东西,我需要休眠一个线程,如果

c++ - Win32 重置事件,如带有 boost C++ 的同步类

我需要一些让人想起Win32重置事件的机制,我可以通过与WaitForSingleObject()和WaitForMultipleObjects()具有相同语义的函数来检查(目前只需要..SingleObject()版本)。但我的目标是多个平台,所以我只有boost::threads(AFAIK)。我想出了下面的类(class),想问一下潜在的问题,以及它是否能胜任这项任务。提前致谢。classreset_event{boolflag,auto_reset;boost::condition_variablecond_var;boost::mutexmx_flag;public:rese