我尝试编写一个程序,通过创建8个线程来对齐数字1-10,000,每个线程将轮流对齐一个数字。意味着一个线程将方形1,另一个将方形2等,直到所有线程都对齐一个数字。然后一个线程将9等等,一直到10,000。我的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <pthread.h>
#include <sys/types.h>
#define NUMBER_OF_THREADS 8
#define START_NUMBER 1
#define END_NUMBER 10000
FILE *f;
void *sqrtfunc(void *tid) { //function for computing squares
int i;
for (i = START_NUMBER; i<= END_NUMBER; i++){
if ((i % NUMBER_OF_THREADS) == pthread_self()){ //if i%8 == thread id
fprintf(f, "%lu squared = %lu\n", i, i*i); //then that thread should do this
}
}
}
int main(){
//Do not modify starting here
struct timeval start_time, end_time;
gettimeofday(&start_time, 0);
long unsigned i;
f = fopen("./squared_numbers.txt", "w");
//Do not modify ending here
pthread_t mythreads[NUMBER_OF_THREADS]; //thread variable
long mystatus;
for (i = 0; i < NUMBER_OF_THREADS; i++){ //loop to create 8 threads
mystatus = pthread_create(&mythreads[i], NULL, sqrtfunc, (void *)i);
if (mystatus != 0){ //check if pthread_create worked
printf("pthread_create failed\n");
exit(-1);
}
}
for (i = 0; i < NUMBER_OF_THREADS; i++){
if(pthread_join(mythreads[i], NULL)){
printf("Thread failed\n");
}
}
exit(1);
//Do not modify starting here
fclose(f);
gettimeofday(&end_time, 0);
float elapsed = (end_time.tv_sec-start_time.tv_sec) * 1000.0f + \
(end_time.tv_usec-start_time.tv_usec) / 1000.0f;
printf("took %0.2f milliseconds\n", elapsed);
//Do not modify ending here
}
我不确定我的错误在哪里。我在main中创建了8个线程,然后根据它们的线程id(tid),我希望该线程对数字进行平方。截至目前,输出文件中没有打印任何内容,我无法弄清楚原因。我的tid比较没有做任何事吗?任何提示都表示赞赏。谢谢你们。
答案 0 :(得分:0)
首先,你故意将参数传递给每个线程,以便它知道它是哪个线程(从0到7)这很好,但是你不再在线程内部使用它(这导致了一个可能的你遇到的困惑)
其次,正如你在解释算法应该如何进行的说法中所说,你说每个线程必须对一组不同的数字进行平方,但是所有这些都要对同一组数字进行平方(实际上)整套数字)
你有两种方法:让每个线程对数字进行平方,然后进行下一个,进一步的8个位置(所以算法是你的解释中描述的算法)或你给出不同的集合(每个1250个连续数字)和让每个线程动作都是独立的间隔。
那就是说,你必须重建你的for
循环来做两个中的一个:
for (i = parameter; i < MAX; i += 8) ...
或
for (i = 1250*parameter; i < 1250*(parameter+1); i++) ...
这样,您将使用一组不同的输入数字运行每个线程。