使用CreateThread创建线程并在线程函数中使用了signal函数按Windows核心编程第5版中的说法进程应该会被终止但我看了createthread  和  signal  函数的代码 , 真的想不出哪些情况会导致进程结束。 有人能给出代码 , 用createthread 创建线程 , 调用signal , 然后程序会终止的例子 

解决方案 »

  1.   

    在线程中终止进程话,直接调用exit()就好了
    #include <Windows.h>
    #include <signal.h>
    #include <process.h>void SignalHandler(int signal)
    {
        printf("Application aborting...\n");
    }DWORD WINAPI ThreadProc(LPVOID lParam)
    {
    int i = 0;
    while(i++ < 50)
    {
    printf("%d\n", i);
    Sleep(50); if(i >= 25)
    {
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGABRT, SignalHandler);
    abort();
    }
    }
    return 0;
    }void main()
    {
    HANDLE handle = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
    WaitForSingleObject(handle, INFINITE);
    CloseHandle(handle);
    }
      

  2.   

    线程中调用abort,进程当然会结束阿,这不是预计中的行为吗? 我要的是
    使用CreateThread创建线程并在线程函数中使用了signal函数按Windows核心编程第5版中的说法进程应该会被终止这里的终止应该是异常终止, 很多地方都说createthread不能与signal 混用 ,但不知为什么,而且我试过,用得很正常  , 我要的是一个不正常的代码
      

  3.   

    windows核心编程原文是怎么说的?
      

  4.   

    Visual C++(32bit)的编程技术手册中指出,使用CreateThread(libcmt.lib)的应用程会导致许多CRT函数失败。实际上,只有signal函数不应该通过CreateThread创建的线程中运行。
    有两种方式创建线程。一种方法是使用CRT函数_beginthread或_beginthreadex(VC 2.0及以上版本);另一种方法是使用API CreateThread。所用的CRT函数(除signal)都能在通过_beginthread或CreateThread创建的线程中正确的运行, 然而在CreateThread创建的线程中使用CRT函数会引发一些问题。
    事实上,的确有一些问题需要说说。如果线程使用了CRT的signal函数,整个进程都会被中止,因为结构化异常处理体尚未准备好
      

  5.   

    我觉得这句话是不是应该这么理解
    如果signal出现异常的话进程会被终止
    如果没有异常也就没有问题
      

  6.   

    不客气
    我在多说两句吧
    windows操作系统有自己的一套结构化异常处理机制
    当然C++本身也有一套异常处理机制
    系统没启动一个进程或线程的时候会自动加上异常捕捉结构
    进程比较好说了
    通过入口函数做映射由系统统一处理
    不过线程就不一样了
    CreateThread是系统API
    只会添加系统的异常处理
    _beginthread是CRT函数
    会添加CRT异常处理
    所以核心编程会建议通过_beginthread启动线程
    这样更稳定
      

  7.   

    应该可以啊,使用createthread创建线程后,在线程里面single,然后用waitforsingleobject等待线程句柄有信号就可以了吧