Данные структуры, переданные в pthread_create, неверны при чтении - PullRequest
0 голосов
/ 07 октября 2019

В приведенном ниже коде я пытаюсь передать структуру в pthread_create. Структура определяется глобально. Затем он инициализируется перед вызовом pthread_create.

// Global scope
struct dat_struct {
  char *dat[SIZE];
  int received[SIZE];
  int numreceived;
};

 // main
  struct dat_struct *data = malloc(sizeof(struct dat_struct));


  for (int i=0; i < nthreads; i++) {
    for (int j=0; j < SIZE; j++) {
      data->received[j] = SIZE;
    }
    data->numreceived = 0;
    pthread_create(&thread_ids[i], NULL, thread_handler, (void*)&data);
  }

void *thread_handler(void *dat) {
  struct dat_struct *data = (struct dat*)dat;
  // If I read data->numreceived it returns a large negative or
  // something incorrect
  ...
  ...

В thread_handler, чтение данных дает неверные результаты. Если я использую gdb для проверки того, что передается в pthread_create, это отличается от того, что принимается на другом конце.

Есть ли фундаментальная проблема в моем коде?

1 Ответ

1 голос
/ 07 октября 2019

Дано

struct dat_struct *data

Этот код

pthread_create(&thread_ids[i], NULL, thread_handler, (void*)&data);

передает struct dat_struct ** в поток как void *. Обратите внимание на двойное значение **.

Таким образом, это неправильно:

void *thread_handler(void *dat) {
  struct dat_struct *data = (struct dat*)dat;

Этот код обрабатывает dat как struct dat_struct * - но вы передали struct dat_struct **. (Я предполагаю, что (struct dat*) является опечаткой).

Вы должны создать тему с

pthread_create(&thread_ids[i], NULL, thread_handler, data);

и

void *thread_handler(void *dat) {
  struct dat_struct *data = dat;

Обратите внимание, что естьнет необходимости приводить к / от void * в C.

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