2015-04-14 66 views
0

我目前正在研究這個多線程素數生成器,它計算2到N之間範圍內素數的數量,此時每個線程計算所有素數,它看起來像線程一個接一個地運行,但我希望所有的線程都能同時運行。多線程素數生成器

現在我想問如何告訴一個線程,它應該只計算一個分片,而不是所有的素數和「t」個線程同時運行。

例如:2-1000四個線程 - >每個線程應該算250號

提前感謝!

這裏是我的時刻:

#include <stdio.h> 
#include <time.h> 
#include <pthread.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 

/* compile: gcc prime.c -lpthread -o prime */ 
/* execute: ./prime -N 1000 -t 8 */ 

pthread_mutex_t aktuell_lock = PTHREAD_MUTEX_INITIALIZER; 


int N; 
int Primzahlen; 

int aktuell = 2; 
int t; 
//int slicesize = N/t; 


void print_usage(void) 
{ 
    printf("Usage: prime -N <value> -t <value>\n"); 
} 

void *prime(void *a) 
    { 

    int Laufvariable; 

    int i; 

    pthread_mutex_lock(&aktuell_lock); 
    for (i = 0; i < N/t; i++) { 

    for (aktuell; aktuell <= N; aktuell++) { 

    for (Laufvariable = (aktuell-1); aktuell % Laufvariable; Laufvariable--) { 
    } 

    if (Laufvariable == 1) 
     Primzahlen++; 
    } 
    } 
    pthread_mutex_unlock(&aktuell_lock); 
     return NULL; 
    } 

int main(int argc, char *argv[]) 
{ 
    struct timespec start, finish; 
    double elapsed; 

    clock_gettime(CLOCK_MONOTONIC, &start); 

    int s; 
    int option; 

    while ((option = getopt(argc, argv, "N:t:")) != -1) 
     switch (option) { 
     case 'N': 
      N = atoi(optarg); 
       break; 
     case 't': 
      t = atoi(optarg); 
       break; 
     default: 
      print_usage(); 
      exit(EXIT_FAILURE); 
     } 
    pthread_t threads[t]; 

    for (s = 0; s < t; s++) { 
     pthread_create(&threads[t], NULL, prime, NULL); 
    } 

    void *result; 

    for (s = 0; s < t; s++) { 
     pthread_join(threads[t], &result); 
    } 
    clock_gettime(CLOCK_MONOTONIC, &finish); 

    elapsed = (finish.tv_sec - start.tv_sec); 
    elapsed += (finish.tv_nsec - start.tv_nsec)/1000000000.0; 

    printf("\nCount Primes [1 .. %d] - TaskCnt: %d - Slicesize: %d\n", N, t, N/t); 
    printf("Threads: %d\n", t); 
    printf("limit: %d\n", N); 
    printf("Total Prime Count: %d\n", Primzahlen); 
    printf("Runtime: %f seconds\n\n", elapsed); 

    return 0; 
} 
+0

使用線程的問題是,最快的方法是僅通過您已經證明的素數來測試除法。這樣一個線程將比4測試每個(奇數)除數的速度更快。 –

+0

你應該提供一些示例代碼來展示你如何管理線程 – mfro

+0

將不同範圍作爲函數參數傳遞給每個pthreat並放棄互斥鎖。你需要重寫pthread函數 – kiviak

回答

0

並行處理使用鎖絕對不是在途中一個可擴展的計劃。

而不是累積全局變量的結果和狀態在鎖下,嘗試積累局部線程特定的結果,然後合併它們。

存在於distribution中的可擴展素數計數器的即用型示例。您可以直接使用它或採取工作範圍分區和減少部分結果的想法,並在您的要求下以普通的C執行它。

0

你可以分階段做到這一點。最簡單的版本使用單個線程來生成素數數組,直到素數(i)*素數(i)> = N。設置R = N素數(i),這是要測試的數字範圍。然後,線程[j](j從0開始)應該從素數(i)+ j *(R/t)到素數(i)+(j + 1)*(R/t)進行測試, prime(i)+ j *(R/t)到N(t是線程數)。每個線程都會生成自己的計數,並且一旦所有線程完成,計數就會相加。

每個線程也可以生成它自己的素數範圍,一旦完成所有線程,數組就被連接起來。這可以擴展爲通過多次傳遞,如找到從2到100的素數,使用線程來查找從100到1000的素數,連接數組,找到從1000到1000000的素數,...。