草庐IT

Multithreading

全部标签

c++ - 在 C++ 中,如何使用多个线程读取一个文件?

我正在Windows7、64位、8核中使用VS2012从本地硬盘读取.csv文件。我正在读取的文件有50,000多行,每行有200多个属性,因此读取数据并将它们提供给相应的变量非常耗时。因此,我想知道是否可以使用多线程来加快速度,即每个线程读取文件的一部分。我在谷歌上搜索了一下,发现有人说,由于硬盘驱动器不是多线程的,因此使用多线程这样做实际上会减慢速度。这是真的吗?如果可以用多线程读取一个文件,谁能给我一个我可以学习的例子?此外,是否可以明确地将线程或任务分配给CPU核心?最后一个问题:我用Python读取了同一个文件,几秒钟后就完成了。我可以知道为什么Python的读取速度比C++

c++ - 在渲染之外的另一个线程中初始化 OpenGL 上下文

我正在主线程中初始化我的OpenGL上下文(SDL/GLEW)。但是渲染是在不同的线程中完成的(比如SDL_GL_SwapWindow或glDrawElements)。问题是,如果我调用SDL_GL_SwapWindow,什么也不会发生。我试图在每次交换后简单地更改透明颜色,但没有任何反应。voidrender(){//Rendering...}intmain(){//Initialization...threadrendering(render);}这会是问题吗? 最佳答案 不会像您预期的那样工作。OpenGL上下文是线程本地的。

c++ - std::thread 并在 visual studio 2013 中 move

我有一个只能move的类和一个按值获取此类对象的函数。在新线程中调用函数:voidfoo(MyClassa){}intmain(){MyClassa;std::threadt(&foo,std::move(a));}我得到一个编译器错误,因为缺少MyClass的复制构造函数(我删除了他),如果我实现他,复制构造函数就会被调用。显然这是一个错误,它在gcc中编译时没有复制构造函数。有什么解决方法吗? 最佳答案 如果方法需要a的所有权,通过堆传递它,最好是在shared_ptr中:voidfoo(std::shared_ptra){}[

c++ - 当 num_threads 变化时,OpenMP 并行区域开销增加

我试图在程序的不同部分使用不同数量的线程来实现最大加速。但是,发现使用num_threads子句切换线程数会产生大量开销。我正在寻找对此的解释,因为根据我的理解,线程池应该始终包含给定数量的线程,而不管调用的实际数量是多少。我也在寻找可能的解决方法。谢谢。示例代码:#include#includevoidomp_sum(intntd){ints=0;#pragmaompparallelnum_threads(ntd){inti=omp_get_thread_num();#pragmaompatomics+=i;}}intmain(){intN=100;intNT1=6,NT2=12;d

c++ - Boost单元测试可以多线程吗?

我的单元测试需要运行大量BOOST_CHECK_CLOSE调用,这会花费很长时间(据我所知在一个线程上)。我希望能够按照这些思路做一些事情:#pragmaompparallelfornum_threads(8)for(inti=0;i但是,当我尝试这个时,似乎发生了一些我无法控制的非常讨厌的内存损坏。段错误最常见,但有时会这样:***stacksmashingdetected***有没有人有一些可以分享的实现我预期结果的好方法的经验?我相信每个人都会喜欢快速运行他们的测试! 最佳答案 它不能像这里提到的那样(第3项)http://w

c++ - 无锁线程池

对于标准C++11和/或在一般上下文中,以下推理是否正确?在实现线程池时,人们通常不想让那些没有工作可做的线程忙于循环。因此,需要某种std::condition_variable。因此,需要某种std::mutex。因此,不可能有一个无锁线程池(没有忙循环)。或者我是否缺少一些使它成为可能的操作系统机制?您能否提供额外的推理来表明不存在无锁非忙循环线程池? 最佳答案 如果允许忙等待,那当然是完全可以的。但是没有忙等待,你需要操作系统的帮助-它不一定是互斥体,它当然可以是read,poll,WaitForMultipleObject

c++ - ThreadSanitizer FATAL 运行时异常

我一直在努力让ThreadSanitizer与我拥有的gcc版本(4.8.2)一起工作,所以我采用了他们的简单示例:#include#include#include#includetypedefstd::mapmap_t;void*threadfunc(void*p){map_t&m=*(map_t*)p;m["foo"]="bar";return0;}intmain(){map_tm;pthread_tt;pthread_create(&t,0,threadfunc,&m);printf("foo=%s\n",m["foo"].c_str());pthread_join(t,0);}

c++ - 我们是否需要保护单个赋值或 if 线程安全语句

假设我有:staticintwrite_log=0;void*logger__run(void*arg){//loggerthreadexecution.while(1){//getlogmessagefromsharedqueue.if(write_log){//justcheckingwrite_logvalue.//writelogstillwrite_logistrue.}//destroylogmessage.}}voidlogger__set_logging(intp_write_log){//otherthreadscanstart/stoploggingbylogger

c++ - 动态 boost 线程运行存储在具有共享指针的 vector 中的对象的方法

我有一个摄像头类,它是网络摄像头的抽象。该类有一个方法rxImageThread(),它本质上是一个图像服务器。我想在n个线程中为n个摄像机运行n个服务器,其中n是动态设置的(来自配置文件)。相机对象存储在一个vector中:std::vector>cameras;我在循环中创建相机对象:cameras.push_back(boost::shared_ptr(newcamera(ip,controlPort,dataPort,imagePort,name)));我有一个vector来存储线程:std::vector>threads;在一个循环中,我想让每个摄像头的rxImageThre

c++ - boost::thread 应用程序,奇怪的数据竞争报告

我编写了一个boost::thread应用程序,其中我可能有一些基于valgrind/helgrind报告的竞争条件。我想确定这些比赛的原因。程序是:#includeboost::mutexmyMutex;boost::condition_variablemyConditionalVariable;boolfunctionWasRun=false;voidfunction(){{boost::lock_guardlock(myMutex);functionWasRun=true;}myConditionalVariable.notify_one();//doSomething1();}