我目前正在完成一项涉及首次使用多线程和多进程编程的任务。我似乎偶然发现了多进程编程,并且意外地将性能提高了约20%,但我不能告诉你我理解它。不幸的是,我还没有幸运地完全找出pthreads,而且我几乎不知道这实际上是如何工作。不用多说,这是我正在尝试正确拆分的代码。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <errno.h>
#include <sys/time.h>
#define DATASIZE (4<<20)
int main()
{
double A[200][200];
double B[200][200];
double C[200][200];
int i, j, k, m;
int outfile, result, count;
unsigned seed;
struct timeval before, after;
char *buff;
buff = (char *)malloc(sizeof(char)*(16<<20));
srandom(seed);
for (i=0; i<200; i++)
for (j=0; j<200; j++) {
A[i][j] = random()/100.0;
B[i][j] = random()/100.0;
}
gettimeofday(&before, NULL);
for (m=0 ; m < 100; m++) {
/* Computation */
/* This is what we're trying to split into one thread*/
for (i=0; i<200; i++)
for (j=0; j<200; j++) {
C[i][j] = 0;
for (k=0; k<200; k++)
C[i][j] += A[i][k]*B[k][j];
}
/* I/O */
/*And this is what we'll put in the other thread*/
outfile = open("testfile", O_RDWR|O_CREAT|O_APPEND, 0777);
if (outfile <= 0)
perror("Error opening file\n");
else {
result = write(outfile, buff, DATASIZE);
if (result <= 0)
perror("Error writing file\n");
}
close(outfile);
}
free(buff);
gettimeofday(&after, NULL);
count = (after.tv_sec - before.tv_sec) * 1e6;
count += (after.tv_usec - before.tv_usec);
printf("Total time for single process in usec: %d\n", count);
return 0;
};
从互联网上发现的几个无用的例子中,他们将这两个事物分解为主要功能之外的外部功能。然后我必须将它们传递给pthread_create,如下所示:
/*I would declare the pthread_t* vars higher in the code*/
pthread_create(pthread_t* first,NULL,/*function name*/,NULL);
pthread_create(pthread_t* second,NULL,/*second function name*/,NULL);
pthread_join(pthread_t* first,NULL);
pthread_join(pthread_t* second,NULL);
真的这么“简单”吗?我是否需要创建新的外部函数,或者我可以以某种方式将它们保存在main中并使用pthread?我是否遗漏了一些了解pthread如何工作以及如何在将来使用它的重要部分?
答案 0 :(得分:1)
我是否需要创建新的外部函数,还是可以将它们保存在main中并使用pthread?
是的,pthread_create()在调用进程中创建新线程,该线程通过调用由此函数的3. argument指定的start_routine()来开始执行:void *(*start_routine) (void *)
。
这真的是“简单”吗?
是的,是的。