pthread_create和pthread_join用于一些简单的函数

时间:2012-03-20 01:04:27

标签: c pthreads

我目前正在完成一项涉及首次使用多线程和多进程编程的任务。我似乎偶然发现了多进程编程,并且意外地将性能提高了约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如何工作以及如何在将来使用它的重要部分?

1 个答案:

答案 0 :(得分:1)

我是否需要创建新的外部函数,还是可以将它们保存在main中并使用pthread?
是的,pthread_create()在调用进程中创建新线程,该线程通过调用由此函数的3. argument指定的start_routine()来开始执行:void *(*start_routine) (void *)

这真的是“简单”吗?
是的,是的。