将指针传递给结构作为线程取消清理处理程序的参数

时间:2009-11-13 21:03:06

标签: c posix pthreads

我无法将指向结构的指针作为参数传递给线程取消清理处理程序。下面是一些示例代码,当它遇到编译器时会爆炸。知道我做错了吗?

#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 个答案:

答案 0 :(得分:1)

我在您发布的代码中看不到作业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)

多么令人不快的惊喜......

答案 1 :(得分:1)

主要问题是您错过了对

的调用
pthread_cleanup_pop(0)

'功能继续'评论后。这将使编译器失败。使用opengroup.org上的push / pop查看示例代码。

正如其他答案所指出的那样,你还有其他一些问题。

在修复所有编译器错误之后,至少编译是这样的:

#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 */
}

答案 2 :(得分:1)

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)
{
}

答案 3 :(得分:0)

使用该代码,ptr_to_struct_def未定义/未初始化,无法正常工作。它应该指向struct_def的一些实例。

另外我认为将(void*)1传递给未使用的参数非常罕见,如果不使用该值,只需使用0

答案 4 :(得分:0)

pthread_cleanup_push(cleanup, (void *)ptr_to_struct_def);
//-------------------^^^^^^^  where is this function defined/declared?

答案 5 :(得分:0)

你不需要指针(注意我删除了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 */
}