草庐IT

c++ - 使用多线程时程序变慢

我有一个执行一些蒙特卡罗算法的简单程序。该算法的一次迭代没有副作用,因此我应该能够使用多个线程运行它。所以这是mywholeprogram的相关部分,这是用C++11编写的:voidtask(unsignedintmax_iter,std::vector*results,std::vector::iteratoriterator){for(unsignedintn=0;nthreads(thread_count);std::vectorresults(max_iter);std::cout::iteratorstart=results.begin()+max_iter/thread_c

c++ - 为什么thread_local不能应用于非静态数据成员以及如何实现线程局部非静态数据成员?

为什么thread_local不能应用于非静态数据成员?thisquestion的公认答案说:“将非静态结构或类成员设为线程本地是没有意义的。”老实说,我看到很多很好的理由让非静态数据成员成为线程本地的。假设我们有某种ComputeEngine,其成员函数computeSomething被连续调用多次。成员函数内部的一些工作可以并行完成。为此,每个线程都需要某种ComputeHelper来提供辅助数据结构等。所以我们真正想要的是:classComputeEngine{public:intcomputeSomething(Argsargs){intsum=0;#pragmaomppara

c++ - 使用所有可用的线程不好的做法?

我最近又开始使用C++并编写了一个简单的测试应用程序,用于通过整数值矩阵找到最佳路径。为了提高此应用程序的性能,我使用C++11std::thread实现了多线程。unsignedintthreadCount=std::thread::hardware_concurrency();std::vectorthreads;for(unsignedintthreadIndex=0;threadIndex截至目前,我只是确定可用线程的总数并为每个线程执行我的测试。这非常有效,但它让我开始思考......尝试为给定系统使用所有可用线程是一种不好的做法吗?除了这个简单的示例之外,多线程的生产级应用

c++ - 线程执行顺序

考虑这个简单的并发示例:#include//std::cout#include//std::thread#include//std::mutexstd::mutexmtx;//mutexforcriticalsectionvoidprint_block(intn,charc){//criticalsection(exclusiveaccesstostd::coutsignaledbylockingmtx):mtx.lock();for(inti=0;i是否始终保证th1将是第一个执行for循环的线程?意思是,当我这样做时:th1.join();th2.join();那我能绝对确定th1

c++ - 如何使 Win32/MFC 线程同步循环?

我是Windows中多线程的新手,所以这可能是一个微不足道的问题:确保线程同步执行循环的最简单方法是什么?我尝试将Event的共享数组传递给所有线程,并在循环结束时使用WaitForMultipleObjects来同步它们,但这让我在一个线程后出现死锁,有时是两个,周期。这是我当前代码的简化版本(只有两个线程,但我想让它具有可扩展性):typedefstruct{intrank;HANDLE*step_events;}IterationParams;intmain(intargc,char**argv){//...IterationParamsp[2];HANDLEstep_event

c++ - C++如何限制运行实例数

我有一个分配大量内存的C++类。它通过调用第三方库来实现这一点,该库旨在在无法分配内存时崩溃,有时我的应用程序会在并行线程中创建我的类的多个实例。线程太多,我崩溃了。我最好的解决方案是确保永远不会同时运行三个以上的实例。(这是一个好主意吗?)我目前实现那个的最佳想法是使用boost互斥体。类似于以下伪代码,MyClass::MyClass(){my_thread_number=-1;//thisisaclassvariablewhile(my_thread_number==-1)for(inti=0;i如您所见,我不太确定这里互斥锁的确切语法。所以总结一下,我的问题是当我想通过限制线程

c++ - 分离的 std::thread 终止后是否需要删除?

我创建了一个newstd::thread对象,然后detach()它。线程运行任意时间,然后自行终止。由于我使用new创建了对象,我是否需要在某个时候delete来释放它的资源?还是线程在终止时有效地删除自身?如果它确实有效地删除自身,如果我在它终止后显式删除它,是否会发生不好的事情? 最佳答案 是的,你必须自己删除它。一旦您调用std::thread::detach,线程将与线程对象分离并允许独立执行,然后线程对象将不再拥有任何线程。所以线程不会也不可能在终止时删除它。 关于c++-分

C++ 11 - 当我将局部变量作为参数传递给线程时是否安全

我有这个代码#includetypedefstruct{inta;shortb;}TestStruct;voidTestParamRef(constTestStruct&test){Sleep(3000);/*Sleeptowaitforthecallerfunctionend*/TestStructi=test;/*Testiftheargument'sstillok*/}voidTestParamPointer(TestStruct*test){Sleep(4000);/*Sleeptowaitforthecallerfunctionend*/TestStructi=*test;/

c++ - Boost.Thread 还是::thread?

我还不是Boost用户。然而,我打算尽快进入它。然而,我不太关心Boost,以及future可能与即将推出的C++0x发生名称冲突或差异。(也许这不是一个真正的问题,但例如我发现boostlambdas语法非常丑陋,BOOST_FOREACH对眼睛有侵略性,以及其他仅个人审美观点)。我对TR2很感兴趣,它似乎是由库实现的Boost.Thread和just::thread.两者似乎都是由AnthonyWilliams编写和维护的。但是just::thread声称非常符合TR2。我想知道你们中是否有人会指示我使用一个或另一个。just::thread不是免费的,但如果它真的像TR2一样,我

c++ - 特定于线程的数据——为什么我不能只使用带有线程 ID 的静态映射?

在阅读POSIX线程时,我遇到了一个线程特定数据的示例。我确实有一个困惑的地方......线程特定的数据接口(interface)看起来有点笨拙,尤其是当你混合使用pthread_once、各种初始化程序等时。有什么理由我不能只使用静态std::map,其中键是pthread_self()id,数据值保存在std::pair的第二部分?我想不出只要它被包裹在互斥量中就无法工作的原因,但我没有看到任何关于它的建议或任何类似的东西让我感到困惑,因为它听起来比提供的API容易得多。我知道线程可能有很多catch-22,所以我想我会问一下,看看我是否要介入……一些不愉快的事情?:)