pthread_create и pthread_join для некоторых простых функций - PullRequest
1 голос
/ 20 марта 2012

В настоящее время я выполняю задание, которое предполагает использование многопоточности и многопроцессорного программирования в первый раз.Кажется, я наткнулся на многопроцессорное программирование и случайно увеличил производительность примерно на ~ 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);

Это действительно так "просто"?Требуется ли создавать новые внешние функции или я могу как-то сохранить их в основном и использовать pthread?Я упускаю какую-то важную часть понимания того, как работает pthread и как его использовать в будущем?

1 Ответ

1 голос
/ 20 марта 2012

Требуется ли создавать новые внешние функции или я могу как-то сохранить их в main и использовать pthread?
Да, pthread_create () создаетновый поток в вызывающем процессе, который начинает выполнение, вызывая start_routine (), заданный 3. аргументом этой функции: void *(*start_routine) (void *).

Это действительно так "просто"?
Да, это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...