C Pthreads Проблема, не могу передать информацию, которую я хочу? - PullRequest
0 голосов
/ 14 апреля 2011

Поэтому я пытаюсь сделать так, чтобы функция запуска потоков открывала файл, который был задан через командную строку, по одному файлу для каждого потока, но мне также нужна функция запуска, чтобы получить массив результатов.Так что, в принципе, мне нужно получить строку (имя файла) и двумерный массив результатов в моем начальном потоке, как-то, я полностью сбит с толку.

У кого-нибудь есть советы или идеи?Спасибо.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include "string.h"


void* func(void *args);

int main(int argc, const char * argv[])
{
    int nthreads = 0;
    int i = 0;
    long **results;

    printf("Enter number of threads to use:\n> ");
    scanf("%d", nthreads);

    pthread_t threadArray[nthreads];

    // results 2d array; 3 rows by nthreads cols
    results = malloc((nthreads*4) * sizeof(long *));   

    for(i = 0; i<nthreads; i++) {
       pthread_create(&threadArray[i], NULL, wordcount, HELP!!!!); 
    } 

    for(i = 0; i<nthreads; i++) {
       pthread_join(threadArray[i], NULL);
    } 

    pthread_exit();
}

void * func(void *arguments)
{     
     FILE *infile = stdin;
     infile = fopen(filename, "rb");    

     fclose (infile);
}

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

Обычно структура, содержащая данные для потока, объявляется и инициализируется, а указатель на эту структуру передается в качестве аргумента потока.

Затем функция потока возвращает void* обратно к указателю структуры и получает данные.

Просто помните, что время жизни этой структуры все еще должно быть действительным, когда поток запланирован (что означает, что вы должны быть очень осторожны, если это локальная переменная). И, как указал Джонатан Леффлер, передайте каждому потоку его собственный экземпляр структуры или будьте очень осторожны при повторном использовании. В противном случае поток может прочитать данные, предназначенные для другого потока, если структура будет повторно использована до того, как поток завершит работу с ним.

Вероятно, самый простой способ решить эти проблемы - malloc() структура для каждого потока, инициализировать его, передать указатель на поток и позволить потоку free(), когда это будет сделано с данными.

1 голос
/ 14 апреля 2011

Последний параметр pthread_create может быть любым объектом, который вы хотите, например, у вас может быть:

struct ThreadArguments {
    const char* filename;
    // additional parameters
};

void* ThreadFunction(void* arg) {
    CHECK_NOTNULL(arg);
    ThreadArguments* thread_arg = (ThreadArguments*) arg;
    // now you can access the other parameters through this thread_arg object
    // ...
}

// ...
ThreadArguments* arg = (ThreadArguments*) malloc(sizeof(ThreadArguments));
ret = pthread_create(&thread_id, attributes, &ThreadFunction, arg);
// make sure to check ret
// ...
pthread_join(thread_id);
free(arg);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...