谁能告诉我,这段C语言代码到底哪里的语法出错啦?

软件和网站开发以及相关技术探讨
回复
头像
thlgood
帖子: 37
注册时间: 2010-12-28 9:13
送出感谢: 0
接收感谢: 1 次

谁能告诉我,这段C语言代码到底哪里的语法出错啦?

#1

帖子 thlgood » 2013-03-17 22:07

代码在这里:

代码: 全选

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

void route(void *arg)
{
    printf("Yes, Yes, Yes!\n");
}

void *func(void *arg)
{
    pthread_detach(pthread_self());

    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

    pthread_cleanup_push(route, NULL);
    while(1)
    {
        sleep(1);
    }
}

int main()
{
    pthread_t pt_one;
    int return_value;
    return_value = pthread_create(&pt_one, NULL, func, NULL);
    sleep(10);
    pthread_cancel(pt_one);

    return 0;
}

编译的时候老是通不过,错误提示是
附件
ss.png
头像
thlgood
帖子: 37
注册时间: 2010-12-28 9:13
送出感谢: 0
接收感谢: 1 次

Re: 谁能告诉我,这段C语言代码到底哪里的语法出错啦?

#2

帖子 thlgood » 2013-03-17 22:12

已经查出问题了,注释pthread_cleanup_push(route, NULL);语句就可以了。。。但是我现在必须要用到这个函数啊。。
头像
cuihao
帖子: 4793
注册时间: 2008-07-24 11:33
来自: 郑州
送出感谢: 1 次
接收感谢: 89 次
联系:

Re: 谁能告诉我,这段C语言代码到底哪里的语法出错啦?

#3

帖子 cuihao » 2013-03-17 22:16

代码: 全选

/* Install a cleanup handler: ROUTINE will be called with arguments ARG
   when the thread is canceled or calls pthread_exit.  ROUTINE will also
   be called with arguments ARG when the matching pthread_cleanup_pop
   is executed with non-zero EXECUTE argument.

   pthread_cleanup_push and pthread_cleanup_pop are macros and must always
   be used in matching pairs at the same nesting level of braces.  */
#  define pthread_cleanup_push(routine, arg) \
  do {                                                                        \
    __pthread_cleanup_class __clframe (routine, arg)
嗯,具体用法我不懂,但根据头文件里面的注释,pthread_cleanup_push和pthread_cleanup_pop必须成对出现。
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 绿
Site: CUIHAO.TK    Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
头像
thlgood
帖子: 37
注册时间: 2010-12-28 9:13
送出感谢: 0
接收感谢: 1 次

Re: 谁能告诉我,这段C语言代码到底哪里的语法出错啦?

#4

帖子 thlgood » 2013-03-17 22:17

找到原因了,pthread_cleanup_push()和pthread_cleanup_pop()必须成对地使用,因为两个宏里面分别有“{”和“}”
回复

回到 “软件/网站开发”