C语言如何终止线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言如何终止线程相关的知识,希望对你有一定的参考价值。

创建了一个时间线程(用 beginthread 创建的),在屏幕上实时显示时间,现在想通过任意键终止它,注意是在线程外部终止,网上的 _endthread 根本就没有说用法,直接在外部调用好像也结束不了。请给一个能在外部终止指定线程的函数,最好是C/C++运行库里的,谢谢

有三种方式可以终止线程,具体调用函数依赖于使用的线程系统。
1 在线程入口函数中,调用return。 即退出线程入口函数,可以实现终止当前线程效果;
2 在线程执行的任意函数,调用当前线程退出函数,可以退出当前线程;
3 在任意位置,调用线程终止函数,并传入要终止线程的标识符,即pid,可以实现终止对应线程效果。
参考技术A 终止线程有三种方法:
1.线程可以在自身内部调用AfxEndThread()来终止自身的运行
2.可以在线程的外部调用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )来强行终止一个线程的运行,
然后调用CloseHandle()函数释放线程所占用的堆栈
3.第三种方法是改变全局变量,使线程的执行函数返回,则该线程终止。

unsigned long __cdecl _beginthread (void (__cdecl *) (void *),
unsigned, void *);
void __cdecl _endthread(void);

unsigned long __cdecl _beginthreadex(void *, unsigned,
unsigned (__stdcall *) (void *), void *, unsigned, unsigned *);
void __cdecl _endthreadex(unsigned);

找到的一些资料,希望有点帮助,要不你代码贴点出来本回答被提问者采纳
参考技术B 做个沙发先~~~

如何安全地终止线程? (使用指针)C++

【中文标题】如何安全地终止线程? (使用指针)C++【英文标题】:How to terminate a thread safely? (with the usage of pointer) c++ 【发布时间】:2019-10-19 06:16:17 【问题描述】:

我目前正在学习 c++11 中的多线程,我对安全终止线程的方式感到困惑。

在 c++ 中,我知道如何创建线程并使用 thread.join() 来安全地确保 main() 在退出之前等待所有线程完成。

但是,我发现一些通过指针实现的多线程代码即使不使用 thread.join() 也能够运行。

class Greating

public:

    Greating(const int& _i):i_(_i)
    ~Greating()
    int i_;
    void say()
    
        std::cout << "Hello World" << i_ << std::endl;
    

;

int main()
    Greating greating1(1);
    Greating greating2(2);

    std::thread t1(&Greating::say, greating1);
    std::thread t2(&Greating::say, greating2);
    return 0;

上面显示的代码绝对会报错"terminate called without an active exception Aborted (core dumped)”,因为我没有使用 t1.join() 和 t2.join()。

但是我在一些代码中发现当他们使用指针来管理线程时,这并没有成为问题,如下图。

class Greating

public:

    Greating(const int& _i):i_(_i)
    ~Greating()
    int i_;
    void say()
    
        std::cout << "Hello World" << i_ << std::endl;
    

;

int main()
    Greating greating1(1);
    Greating greating2(2);

    std::thread* tt1 = new std::thread(&Greating::say, greating1);
    std::thread* tt2 = new std::thread(&Greating::say, greating2);
    return 0;

输出是:

Hello WorldHello World12
Hello World12

没有报告错误。这让我很困惑。

所以我的问题是:

    为什么当我们使用指针管理线程时,不能使用函数thread.join()? 如何正确终止线程? (可能要等待可调用函数完成?)

非常感谢!

【问题讨论】:

对指针的大切换有以下效果:泄漏线程对象。否则,线程对象将在没有加入或分离的情况下被销毁。因此,只有第一个案例报告该错误才有意义。 【参考方案1】:

使用动态分配创建对象时,您必须使用operator delete 释放内存,以便它调用适当的析构函数。

在第一个示例中,创建了两个 std::thread 对象。在main函数结束时,析构函数std::thread::~thread被调用。由于线程没有join,所以析构函数报错。

另一方面,在第二个示例中,您调用了operator new,因此您创建了具有动态分配的对象。但是,你没有调用operator delete,所以没有调用析构函数。也就是说,程序没有检查线程是否加入。

因此,正确终止线程的唯一方法是调用std::thread::join。如果你想使用指针,你必须这样做:

std::thread *th = new std::thread(foo);
...
th->join();
delete th;

【讨论】:

以上是关于C语言如何终止线程的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何终止线程?

C++多线程强制终止

C++多线程强制终止

c语言实现多线程

C语言 pthread_join()函数

c语言中,创建的子线程如何给主线程发消息?