我无法将指向结构的指针作为参数传递给线程取消清理处理程序。下面是一些示例代码,当它遇到编译器时会爆炸。知道我做错了吗?
#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 */
}
答案 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 */
}