我目前正在研究這個多線程素數生成器,它計算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;
}
使用線程的問題是,最快的方法是僅通過您已經證明的素數來測試除法。這樣一個線程將比4測試每個(奇數)除數的速度更快。 –
你應該提供一些示例代碼來展示你如何管理線程 – mfro
將不同範圍作爲函數參數傳遞給每個pthreat並放棄互斥鎖。你需要重寫pthread函數 – kiviak