c++ - 在单独的线程中处理 vector 元素

标签 c++ multithreading parallel-processing

我正在尝试在单独的线程中处理 vector 的元素,并将结果放入不同的 vector 中。我已经尝试使用互斥锁和代码周围的关键部分,我在其中检查并从输入 vector 中取出元素,但是当我运行代码时遇到访问冲突。

编辑:我更新了代码,将结果放回不同关键部分的 vector 中,并在线程启动前初始化 vector 。

#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <iostream>
#include <vector>

#define MAX_THREADS  4

void InvertProc( void * MyID );      // Threads 2 to n: display 
void ShutDown( void );               // Program shutdown 

int     ThreadNr;                    // Number of threads started 
CRITICAL_SECTION cs, cs2;

std::vector<int> _oTempVector;
std::vector<int> _oOutVector;

int OutCounter;

int _tmain(int argc, _TCHAR* argv[])
{     
   ThreadNr = 0;
   OutCounter = 0;

   for ( int i = 0; i < 50000; i++ ) {
      _oTempVector.push_back( i );
      _oOutVector.push_back( 0 );
   }

   InitializeCriticalSection( &cs );   
   InitializeCriticalSection( &cs2 ); 

   std::vector<HANDLE> events;
   for ( ThreadNr = 0; ThreadNr < MAX_THREADS; ThreadNr++ ) {            
      HANDLE handle = (HANDLE)_beginthread( InvertProc, 0, &ThreadNr );      
      events.push_back( handle );
   }

   WaitForMultipleObjects( events.size(), &events[0], true, INFINITE );  

   std::cout << "outvector contains:" << _oOutVector.size() << "elements"; 
   std::cout << '\n'; 
}


void InvertProc( void *pMyID )
{   
   do {
      EnterCriticalSection( &cs ); 
      if ( _oTempVector.size() > 0 ) {
         int iElement = _oTempVector.back();
         _oTempVector.pop_back();
         LeaveCriticalSection( &cs );

         iElement *= -1;

         EnterCriticalSection( &cs2 ); 
         _oOutVector[OutCounter] = iElement; 
         OutCounter++;
         LeaveCriticalSection( &cs2 );
      }
   } while ( _oTempVector.size() > 0 );   
}

最佳答案

你的输出 vector 不在临界区内作为共享对象它应该...... 因为如果多个线程同时尝试 push_back,您将面临 Write over Write Data 竞争!!!!

  EnterCriticalSection( &cs ); 
  if ( _oTempVector.size() > 0 ) {
     int iElement = _oTempVector.back();
     _oTempVector.pop_back();
          iElement *= -1;
     _oOutVector.push_back( iElement );   
     LeaveCriticalSection( &cs );
  }
 } while ( _oTempVector.size() > 0 );   

生成的运行线程将比并发运行更多的顺序运行

要解决这个问题,您必须采取不同的方式: 1)你能拆分问题吗,每个线程应该处理输入 vector 的连续元素 2) 如果输出 vector 在一开始就用输入的大小进行了初始化,那么你就消除了所有由于插入而产生的问题!

每个正在运行的线程将 *-1 给定范围的数字输入并将结果放在输出 vector 的特定位置(无需交互)与其他线程以便您可以删除锁

void InvertProc( void *pMyID )
{   
    int threadnum = *((int*)pMyID);
    int chunk = input.size()/THREAD_NUM;
    int start = threadnum*chunk;
    int end = start+chunk;
    for (I = start ; I < end ; ++I)
    {
        output[i] = input[i]*-1;
    }
 }

关于c++ - 在单独的线程中处理 vector 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17647674/

相关文章:

c++ - 处理 Qt5 中 QRegularExpressions 中的重音字母

c++ - 如何设置在 Windows 登录屏幕上打开应用程序的按钮

c++ - 使用 boost::thread 开始/停止记录数据(第二次更新)

c++ - 在 Visual Studio 2005 中基于命令行作为 GUI 应用程序或控制台应用程序启动的可执行文件

c++ - 是否可以在现代 C++ 中使用 fork?

android - 如何在 Android 中的非 UI 线程上执行延迟

synchronization - CUDA/OpenCL 中的现实死锁示例

gradle - 当并行,正常任务混合在一起时,并行任务执行会破坏顺序

hudson - Jenkins CI (Hudson) - 如何启动交互式下游作业?

c++ - 多次读取文件后,使用 ifstream 读取文件不起作用