MinGW-w64 pthread_cleanup_pop()错误

时间:2015-01-21 12:42:26

标签: c++ gcc pthreads mingw

在编译包含对pthread_cleanup_pop(E)宏的“调用”的C ++程序时,g ++会抛出以下错误:

error: second operand to the conditional operator is of type 'void', but the third operand is neither a throw-expression nor of type 'void'

现在,这里明显的问题是上面的宏扩展到了 (*pthread_getclean() = _pthread_cup.next, (E?_pthread_cup.func((pthread_once_t *)_pthread_cup.arg):0));}其中第二个表达式是对返回void的函数的调用,但第三个表达式只是0。

Althoug我在这里得到了基本问题,我真的不明白为什么在这个特定用途中出现警告,因为条件的“结果”没有分配给任何东西。

为了记录:我使用MinGW-w64 3.3.0(GCC 4.9.2)编译了C ++程序,无论是否使用-std = c ++ 98。在这两种情况下,都会发生错误。如果我编译与C程序相同的代码(有或没有-std = c99),则没有错误。

除了编辑pthread.h之外,有没有人知道如何摆脱C ++中的错误?

非常感谢提前!

编辑:以下是一些示例代码供参考:

#include <pthread.h>

static int cancelled = 0;

static void test_thread_cleanup(void *_arg){
    cancelled = 1;
}

static void* test_thread(void *_arg){
    pthread_cleanup_push(&test_thread_cleanup, NULL);   // push cleanup handler on stack
    while (1){                                          // never left unless cancelled via pthread_cancel() from main()
        pthread_testcancel();                           // just test for pthread_cancel() having been called
    }
    pthread_cleanup_pop(1);                             // pop cleanup handler from stack

    return NULL;                                        // actually never reached
}

int main(void){
    pthread_t       th;

    pthread_create(&th, NULL, &test_thread, NULL);
    pthread_cancel(th);
    pthread_join(th, NULL);

    return cancelled;
}

0 个答案:

没有答案