no puede proporcionar una respuesta específica C++ 11 ya que estamos todavía en su mayoría utilizando pthreads. Pero, como una respuesta independiente del lenguaje, se puede paralelizar algo al configurarlo para que se ejecute en una función separada (la función de subprocesamiento).
En otras palabras, usted tiene una función como:
def processArraySegment (threadData):
arrayAddr = threadData->arrayAddr
startIdx = threadData->startIdx
endIdx = threadData->endIdx
for i = startIdx to endIdx:
doSomethingWith (arrayAddr[i])
exitThread()
y, en su código principal, se puede procesar la matriz en dos trozos:
int xyzzy[100]
threadData->arrayAddr = xyzzy
threadData->startIdx = 0
threadData->endIdx = 49
threadData->done = false
tid1 = startThread (processArraySegment, threadData)
// caveat coder: see below.
threadData->arrayAddr = xyzzy
threadData->startIdx = 50
threadData->endIdx = 99
threadData->done = false
tid2 = startThread (processArraySegment, threadData)
waitForThreadExit (tid1)
waitForThreadExit (tid2)
(teniendo en cuenta la salvedad que debe asegurarse de hilo 1 se ha cargado los datos en su almacenamiento local antes el hilo principal comienza modificándolo para el hilo 2, posiblemente con un mutex o utilizando un array de estructuras, uno por hilo).
En otras palabras, es muy raro que una simple cuestión de simplemente modificando un bucle for
para que se ejecute en paralelo, aunque eso sería bueno, algo así como:
for {threads=10} ({i} = 0; {i} < ARR_SZ; {i}++)
array[{i}] = array[{i}] + 1;
su lugar, se requiere un poco de reordenación su código para aprovechar los hilos.
Y, por supuesto, debe asegurarse de que tenga sentido que los datos se procesen en paralelo. Si está configurando cada elemento de la matriz en el anterior más 1, no será de gran ayuda el procesamiento en paralelo, simplemente porque tiene que esperar a que se modifique primero el elemento anterior.
Este ejemplo particular anteriormente utiliza simplemente un argumento pasado a la función del hilo para especificar qué parte de la matriz se debe procesar. La función de hilo en sí contiene el bucle para hacer el trabajo.
¿Hay alguna sección crítica en el ciclo for? –
Cuanto más miro a OMG, creo que std :: thread no está destinado a reemplazarlo. 'std :: thread' no está destinado a optimizar operaciones CRUD de bajo nivel. –
puede publicar un bucle que está intentando paralelizar? –