代码之家  ›  专栏  ›  技术社区  ›  Adrian Panasiuk

如果从C源调用而不是C++源调用pthRead退出,则取消处理程序将不运行

  •  0
  • Adrian Panasiuk  · 技术社区  · 16 年前

    我将C++源与C源和C++源链接起来。我用p螺纹创建一个线程,一个取消点,然后通过C或C++源文件调用pthRead退出。

    如果pthread_exit调用来自C源,则取消处理程序不会触发!为什么会这样?

    B.C.

    #include <cstdio>
    #include <cstdlib>
    #include <stdbool.h>
    #include <pthread.h>
    
    
    extern "C" void V();
    extern "C" void Vpp();
    extern "C" void Vs();
    
    #define PTHREAD_EXIT Vs
    
    
    
    
    
    void cleanup(void*v)
    {
        fprintf(stderr, "Aadsfasdf\n");
        exit(0);
    }
    
    
    void* f(void*p)
    {
        pthread_cleanup_push(cleanup, NULL);
        PTHREAD_EXIT();
        pthread_cleanup_pop(true);
    
        return NULL;
    }
    
    int main()
    {
        pthread_t p;
        if (pthread_create(&p, NULL, f, NULL))
            abort();
        for(;;);
    }
    

    VP.CC:

    #include <pthread.h>
    
    extern "C" void Vpp();
    void Vpp() {
        pthread_exit(0);
    }
    

    V.C:

    #include <pthread.h>
    
    void V() {
        pthread_exit(0);
    }
    

    vs:

    .text
    Vs: .global Vs
        call pthread_exit
        spin: jmp spin
    

    编译时使用

    g++ -c vpp.cc -g -o vpp.o -Wall
    gcc -c v.c -g -o v.o -Wall
    as vs.s -o vs.o
    g++ b.cc vpp.o v.o vs.o -o b -lpthread -g -Wall
    

    如果pthread_exit是vpp,程序将显示一条消息并终止,如果它是v或vs,则不会。

    v和vpp的分解是相同的,在v和vpp之间更改pthread_exit的定义只会在 call V call Vpp 在拆卸过程中。

    编辑: 在另一台计算机上不可复制,所以我想我在库中出错了。

    3 回复  |  直到 16 年前
        1
  •  1
  •   1800 INFORMATION    16 年前

    我不知道,但是你正在给出取消处理程序C++链接。如果您也使用C链接,会发生什么?

    extern "C"
    {
      void cleanup(void*v) { ... }
    }
    
        2
  •  1
  •   Christophe Vu-Brugier    16 年前

    在我的机器上安装的“pthread.h”头文件中, pthread_cleanup_push()函数的定义方式与c和 C++(搜索α-cPLUS)。

    您可以尝试为f()和cleanup()提供C链接吗?

    您可能会发现上面的链接很有趣: http://www.cs.rit.edu/~afb/20012/cs4/slides/threads-05.html

        3
  •  0
  •   Adrian Panasiuk    16 年前

    灵感来自于布鲁吉尔,我看了一眼 pthread.h 发现我必须补充

     #undef __EXCEPTIONS
    

    包括之前 pth.h . 这是一个满足我当前需要的令人满意的解决方案。

    推荐文章