2

スレッドを作成するとき、いくつかの引数を渡したいです。だから私はヘッダーファイルで次のように定義します:

struct data{
  char *palabra;
  char *directorio;
  FILE *fd;
  DIR *diro;
  struct dirent *strdir;

};

.cファイルで私は次のことをします

if (pthread_create ( &thread_id[i], NULL, &hilos_hijos, ??? ) != 0){
       perror("Error al crear el hilo. \n");
       exit(EXIT_FAILURE);
} 

このすべての引数をスレッドに渡すにはどうすればよいですか。私は約:

1)最初にmallocを使用してこの構造にメモリを割り当て、次に各パラメータに値を指定します。

 struct data *info
 info = malloc(sizeof(struct data));
 info->palabra = ...;

2)定義する

 struct data info 
 info.palabra = ... ; 
 info.directorio = ...; 

次に、スレッドでこれらのパラメーターにアクセスするにはどうすればよいですかvoid thread_function(void * arguments){??? }

前もって感謝します

4

4 に答える 4

7

これが実際の(そして比較的小さい)例です:

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

/*                                                                                                                                  
 * To compile:                                                                                                                      
 *     cc thread.c -o thread-test -lpthread                                                                                         
 */

struct info {
    char first_name[64];
    char last_name[64];
};

void *thread_worker(void *data)
{
    int i;
    struct info *info = data;

    for (i = 0; i < 100; i++) {
        printf("Hello, %s %s!\n", info->first_name, info->last_name);
    }
}

int main(int argc, char **argv)
{
    pthread_t thread_id;
    struct info *info = malloc(sizeof(struct info));

    strcpy(info->first_name, "Sean");
    strcpy(info->last_name, "Bright");

    if (pthread_create(&thread_id, NULL, thread_worker, info)) {
        fprintf(stderr, "No threads for you.\n");
        return 1;
    }

    pthread_join(thread_id, NULL);

    return 0;
}
于 2012-06-22T19:11:56.013 に答える
0

オプション#2は使用しないでください。構造体は上書きされるdata可能性があります(明示的に、たとえば同じ構造体を使用して別のスレッドを開始するか、暗黙的に、たとえばスタック上で上書きされます)。オプション#1を使用します。

データを取得するには、スレッドの開始時に、

struct data *info = (struct data*)arguments;

その後、通常どおりアクセスinfoします。スレッドが完了したら、それを確認してくださいfree(または、私が好むように、スレッドに参加した後、呼び出し元にそれを解放してもらいます)。

于 2012-06-22T19:11:55.357 に答える
0

上記の最初のケースで行ったように、構造体へのポインターを作成します。

//create a pointer to a struct of type data and allocate memory to it
struct data *info
info = malloc(sizeof(struct data));

//set its fields
info->palabra   = ...;
info->directoro = ...;

//call pthread_create casting the struct to a `void *`
pthread_create ( &thread_id[i], NULL, &hilos_hijos, (void *)data);
于 2012-06-22T19:16:41.257 に答える
0

1) 以下のように定義せず、malloc を使用する必要があります。

struct data *info;
info = (struct data *)malloc(sizeof(struct data));

以下のように ptherad 呼び出しで構造体のポインタを渡します

pthread_create ( &thread_id[i], NULL, &thread_fn, (void *)info );

2)以下のようにスレッド関数でそれらにアクセスできます

void thread_function ( void *arguments){

struct data *info = (struct data *)arguments;

info->....

}
于 2012-06-22T19:19:10.023 に答える