передача указателя на структуру в качестве аргумента обработчику очистки отмены потока - PullRequest
1 голос
/ 14 ноября 2009

У меня проблемы с передачей указателя на структуру в качестве аргумента обработчику очистки отмены потока. Вот пример кода, который взрывается при попадании в компилятор. Есть идеи, что я делаю не так?

#include <pthread.h>

typedef struct struct_def {
     /* data */
} struct_def;

struct_def *ptr_to_struct_def;

void *
thread_function(void *arg)
{
     pthread_cleanup_push(cleanup, (void *)ptr_to_struct_def); /* correct? */

     /* function continues */
}

int
main()
{
     int err;
     pthread_t tid;

     err = pthread_create(&tid1, NULL, thread_function, (void *)1);

     /* main continues */
}

Ответы [ 6 ]

1 голос
/ 06 октября 2010
typedef struct
{

} struct_def;

struct_def *ptr_to_struct_def;

void * thread_function(void *arg)

int main()
{
     int err,iResult;
     pthread_attr_t sThreadAttr;
     iResult = pthread_attr_init(&sThreadAttr);
     assert(iResult==0);

     pthread_t tid;

     err = pthread_create(&tid1, &sThreadAttr, thread_function, (void *)&ptr_to_struct_def);

 iResult = pthread_join(sThread, NULL);
  assert(iResult==0);

     /* main continues */
#else

thread_function();
#endif

  // the end
  return 0;
}

void * thread_function(void *arg)
{
}
1 голос
/ 14 ноября 2009

Основная проблема в том, что вы пропускаете звонок на

pthread_cleanup_pop(0)

после комментария «функция продолжается». Это приведет к сбою компилятора. Проверьте пример кода с помощью push / pop на opengroup.org .

У вас также есть несколько других проблем, как указано в других ответах.

Вот что-то, что хотя бы компилирует после исправления всех ошибок компилятора:

#include <pthread.h>

typedef struct struct_def {
         /* data */
} struct_def;

struct_def *ptr_to_struct_def;

void cleanup (void *arg)
{
      /* Do your cleanup for the thread here */
}

void *
thread_function(void *arg)
{
    pthread_cleanup_push(cleanup, (void *)ptr_to_struct_def); /* correct? */
    /* Function continues */
    pthread_cleanup_pop (0);
}

int
main()
{
    int err;
    pthread_t tid;

    err = pthread_create(&tid, NULL, thread_function, (void *)1);
    /* main continues */
}
1 голос
/ 14 ноября 2009

Я не вижу назначения ptr_to_struct_def = &struct_def; в коде, который вы разместили.

Подожди ... ты сказал компилятор? Если это не компилируется - опубликуйте ошибку компилятора. Хотя я не думаю, что ты это имел в виду.

Хорошо, вы имели в виду это :) Благодаря @Gonzalo я посмотрел на /usr/include/pthread.h и, конечно, push / pop - это макросы (по крайней мере, для Linux здесь):


#  define pthread_cleanup_push(routine, arg) \
  do {                                        \
    __pthread_cleanup_class __clframe (routine, arg)
...
#  define pthread_cleanup_pop(execute) \
    __clframe.__setdoit (execute);                        \
  } while (0)

Какой неприятный сюрприз ...

0 голосов
/ 14 ноября 2009

Вам не нужен указатель (обратите внимание, я удалил typedef):

typedef struct struct_def {
 /* data */
} struct_def;

struct_def *ptr_to_struct_def;

void *
thread_function(void *arg)
{
     pthread_cleanup_push(cleanup, (void *)ptr_to_struct_def); /* correct? */

     /* function continues */
}

int
main()
{
     int err;
     pthread_t tid;

     err = pthread_create(&tid1, NULL, thread_function, (void *)1);

     /* main continues */
}
0 голосов
/ 14 ноября 2009
pthread_cleanup_push(cleanup, (void *)ptr_to_struct_def);
//-------------------^^^^^^^  where is this function defined/declared?
0 голосов
/ 14 ноября 2009

С этим кодом ptr_to_struct_def не определено / неинициализировано, что не может работать. Он должен указывать на некоторый экземпляр struct_def.

Кроме того, я думаю, что для неиспользуемых аргументов достаточно редко передавать (void*)1, просто используйте 0, если вы не используете значение.

...