草庐IT

Multithreading

全部标签

c++ - 如果从同一个信号调用两个槽,Qt 可以同时调用它们吗?

如果在两个不同的线程中有两个槽,并且这些槽连接到第三个线程中的信号。两个槽会同时被信号调用还是每次都被同步调用?我问是因为我想发送一些回调数据结构(用QSharedPointer封装)并询问是否需要内部锁定机制。 最佳答案 如果您使用Qt::QueuedConnection将信息传递给线程,则不需要锁定实际的信号/槽调用,因为QueuedConnection机制以线程安全的方式处理此问题。话虽如此,您仍然需要保护您的线程访问的任何共享内存,无论它们是如何调用的。第三个线程发出单个信号以导致调用两个槽这一事实不会改变这一点。

c++ - 这种线程间通信的方法安全吗?

我有3个对象(继承自QObject),每个对象都包含一个单独的std::list。每个对象都在主gui线程(没有父线程)中创建,然后被推送到它自己的线程(使用Qt的QObject::moveToThread())。每个线程都连接到一个图形用户界面,消息在不同线程之间发送数据。每个线程本质上是处理它自己的列表。例如:目标1:数据消费者。它弹出列表的前面(如果存在数据)以供使用。它还有一个可用的SLOT,以便其他线程可以向它推送数据。没有其他对象可以直接访问此列表,只有原始QObject类。目标2:数据的生产者。它将数据推送到它的列表中。它有SLOTS可供其他人“ping”它以获取数据,而

c++ - 如何在多线程 C++ 中实现 "soft barrier"

我有一些具有以下结构的多线程C++代码:do_thread_specific_work();update_shared_variables();//checkpointAdo_thread_specific_work_not_modifying_shared_variables();//checkpointBdo_thread_specific_work_requiring_all_threads_have_updated_shared_variables();如果所有线程都只到达检查点A,检查点B之后的工作本可以开始,因此我提出了“软屏障”的概念。通常,多线程库只提供“硬屏障”,其中

线程拼图中的c++ 11仿函数

请考虑以下代码片段。使用GCC4.6.1,x变为0,y变为1。为什么使用和不使用单独的线程会得到不同的结果?我应该如何修改代码以使两个版本产生相同的结果(即整数值递增1?)谢谢。structfunctor{voidoperator()(int&x){++x;}};voidtfunc(functor&f,int&x){f(x);}intmain(){functorf;intx=0,y=0;std::threadt=std::thread(tfunc,f,x);t.join();std::cout 最佳答案 很容易看出发生了什么。只需替

c# - .NET 或 C++ 中的 Erlang 风格并发

在许多项目之后,单向异步消息传递似乎是编写并发分布式网络服务并保持理智的唯一方法。我正在寻找一个简单的、最好是开源的.NET或C++库来实现类似于ErlangOTP平台的异步消息传递概念。到目前为止,我只发现RetLang有点相似,但是它不支持通过网络传递消息,并且好像被遗弃了。我还评估了TPL、TPLDataFlow和RxLib。他们都不支持我正在寻找的东西。在C++世界中,我只关注了Boost。"ConciseexplanationofErlang-styleconcurrency"欢迎任何指点! 最佳答案 看看0MQ,它有几乎

c++ - 具有 PPL 和并行内存分配的线程 ID

我有一个关于MicrosoftPPL库和一般并行编程的问题。我正在使用FFTW执行大量(100,000)64x64x64FFT和逆FFT。在我当前的实现中,我使用并行for循环并在循环内分配存储数组。我注意到在这些情况下,我的CPU使用率最高仅达到60-70%。(请注意,这仍然比我测试过的FFTW提供的内置线程FFT更好用)。由于我使用的是fftw_malloc,是否可能发生过度锁定而阻止完全使用?鉴于此,在主处理循环之前为每个线程预分配存储数组是否可取,这样循环本身就不需要锁?如果是这样,MSFTPPL库怎么可能呢?我以前一直在使用OpenMP,在这种情况下,使用提供的函数获取线程I

c++ - Valgrind 挂起以分析多线程程序

我有一个在多核机器上运行的多线程程序(在Linux平台上使用Pthreads在C中实现)。我使用带有--memcheck选项的ValGrind来查找我的代码中存在的一些内存问题。但它挂起。为了完整地概述问题,这里是背景。代码在开始时有一些顺序部分作为初始化的一部分,随后它创建了8个线程(使用PthreadAPI)和梯级以完成。一段时间后,我的代码转储“核心”。我使用了GDB,它给出了以下跟踪。=======Backtrace:=========/lib/tls/i686/cmov/libc.so.6[0xb7cd47cd]/lib/tls/i686/cmov/libc.so.6(cfr

c++ - 将 OpenMP 与 C++ 结合使用的算法库

我在GNU/Linux桌面上使用C++编程语言和GCC。我正在努力实现C++中的一些PRAM并行算法。据我了解,在多核CPU上使用OpenMP或多或少有助于模拟CREWPRAM算法。许多复杂的PRAM算法,涉及并行前缀和、排序等操作,对全局地址空间等中的vector执行元素明智的操作。不知何故,在谷歌搜索大约15分钟后,似乎没有提供此功能的库,即一些开箱即用的基本并行算法或数据结构,如标准模板库。谁能列出任何这样的库?编辑:本质上,我需要的是一个类似于ThrustLibrary的OpenMP,它用于CUDA世界。http://thrust.github.com/

c++ - 线程安全传递运算符

我正在为我们的堆内存管理器覆盖new()和new[]()运算符。new()有一个mutex并且是线程安全的,但我没有向new[]()添加互斥锁,它的作用是传递运算符,因为我怀疑调用时它会在堆栈上。new[]()将在堆栈上并且不需要自己的互斥量是否正确?/*!\briefOverridetheStandardC++new[]operator\paramsize[in]Numberofbytestoallocate\exceptionstd::bad_alloc\returnsPointertothestartoftheallcoatedmemoryblockof\csizebytes\t

c++ - 当 QFileDialog::getOpenFileName 窗口打开时,程序意外结束

我正在编写一个简单的Qt应用程序来测试多线程(这对我来说也是全新的)。我制作了一个QApplication来管理GUI,然后我编写了一个包含类MainWindow的类VisionApp,它是一个子类QMainWindow的。在MainWindow类中,我编写了一个函数voidMainWindow::getfromfilevd(),它使用以下方法连接到按钮:QObject::connect(ui->FileVdButton,SIGNAL(clicked()),this,SLOT(getfromfilevd()));然后我想使用QFileDialog::getOpenFileName从文件