我添加了一个线程来计算第一个数组的3个,而主进程生成第二个数组。我认为这会使程序更快,但在Linux上使用time命令后,带线程的那个占用0m7.627s而另一个占用0m5.701s。 起初我以为我使用的是一个非常小的长度,由于创建线程的时间,它只是更大,但事实并非如此。时差与长度成正比... 这只适用于更多线程吗? (在另一个例子中) 难道我做错了什么? 另外我不明白pthread_join(...,this)的第二个参数是如何工作的,我已经尝试了许多不同的方式而且它永远不会起作用。我很少帮助会很棒,谢谢。
没有主题:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>
#define LENGTH 100000000
void * count3s(void * i){
int numberOf3 = 0;
int * j = (int *) i;
int counter = 0;
for(counter = 0; counter < LENGTH; counter++){
if(*(j+counter) == 3){
numberOf3++;
}
}
*((int *) i) = numberOf3;
return i;
}
int main(int argc, char *argv[]){
pthread_t p0, p1;
int * i = (int *) malloc(sizeof(int)*LENGTH);
int * j = (int *) malloc(sizeof(int)*LENGTH);
int c = 0, d = 0;
srand(0);
for(c=0;c<LENGTH;c++){
*(i+c) = rand() % 4;
}
for(c=0;c<LENGTH;c++){
*(j+c) = rand() % 4;
}
d = *((int *) count3s((void *) i));
c = *((int *) count3s((void *) j));
printf("C:%d, D:%d\n", c, *i);
return 0;
}
使用主题:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>
#define LENGTH 100000000
void * count3s(void * i){
int numberOf3 = 0;
int * j = (int *) i;
int counter = 0;
for(counter = 0; counter < LENGTH; counter++){
if(*(j+counter) == 3){
numberOf3++;
}
}
*((int *) i) = numberOf3;
return i;
}
int main(int argc, char *argv[]){
pthread_t p0, p1;
int * i = (int *) malloc(sizeof(int)*LENGTH);
int * j = (int *) malloc(sizeof(int)*LENGTH);
int c = 0, d = 0;
srand(0);
for(c=0;c<LENGTH;c++){
*(i+c) = rand() % 4;
}
//thread starts counting 3's
pthread_create(&p0, NULL, count3s,(void *)i); //thread created
for(c=0;c<LENGTH;c++){
*(j+c) = rand() % 4;
}
pthread_join(p0, NULL);
c = *((int *) count3s((void *) j));
printf("C:%d, D:%d\n", c, *i);
return 0;
}
答案 0 :(得分:0)
因为创建线程不是免费的
答案 1 :(得分:0)
如果修改main以立即生成所有随机数,则处理每个数组 你会看到一个改进。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>
#define LENGTH 100000000
void * count3s(void * i){
int numberOf3 = 0;
int * j = (int *) i;
int counter = 0;
for(counter = 0; counter < LENGTH; counter++){
if(*(j+counter) == 3){
numberOf3++;
}
}
*((int *) i) = numberOf3;
return i;
}
int main(int argc, char *argv[]){
pthread_t p0, p1;
int * i = (int *) malloc(sizeof(int)*LENGTH);
int * j = (int *) malloc(sizeof(int)*LENGTH);
int c = 0, d = 0;
srand(0);
for(c=0;c<LENGTH;c++){
*(i+c) = rand() % 4;
*(j+c) = rand() % 4;
}
//thread starts counting 3's
pthread_create(&p1, NULL, count3s,(void *)j);
pthread_create(&p0, NULL, count3s,(void *)i); //thread created
pthread_join(p1, NULL);
pthread_join(p0, NULL);
printf("C:%d, D:%d\n", *j, *i);
return 0;
}
这给了我的结果 新结果:
threads
C:24999967, D:24998864
real 0m2.994s
user 0m3.064s
sys 0m0.452s
threadless
C:24996371, D:25002460
real 0m3.510s
user 0m3.196s
sys 0m0.300s
这是一个很小的改进,但它是一个改进。
上一个结果:
threads-wrong
C:24996371, D:25002460
real 0m3.840s
user 0m4.032s
sys 0m0.328s
threadless
C:24996371, D:25002460
real 0m3.518s
user 0m3.148s
sys 0m0.356s