【问题标题】:p_thread: exit from multiple threadspthread:从多个线程中退出
【发布时间】:2014-03-25 23:35:16
【问题描述】:

我在我的程序中创建了两个线程。我想根据标志在 thread_2 函数中终止 thread_1,反之亦然。我尝试了 exit() 和 pthread_exit(Thread_id) 但它不起作用。我想通过调用 pthread_cancel 来取消线程执行,但问题是我无法在 pthread_create 之前传递线程 ID。有什么建议吗??

【问题讨论】:

    标签: c++ multithreading pthreads exit


    【解决方案1】:

    您可以查看pthread_cancel 的工作原理in the manpage

    但是,既然你提到了 C++,为什么不使用语言特性呢?可以使用条件变量向一个或多个其他线程发出信号。

    Live On Coliru

    如果你没有 C++11,你可以使用 Boost Threads。

    #include <thread>
    #include <condition_variable>
    #include <iostream>
    
    using namespace std;
    
    struct workers
    {
        mutex mx;
        condition_variable cv;
        bool canceled;
    
        workers() : canceled(false) {}
    
        void thread1()
        {
            cout << __PRETTY_FUNCTION__ << " start\n";
            this_thread::sleep_for(chrono::seconds(2));
    
            {
                unique_lock<mutex> lk(mx);
                cout << __PRETTY_FUNCTION__ << " signaling cancel\n";
                canceled = true;
                cv.notify_all();
            }
    
            this_thread::sleep_for(chrono::seconds(2));
            cout << __PRETTY_FUNCTION__ << " done\n";
        }
    
        void thread2()
        {
            cout << __PRETTY_FUNCTION__ << " start\n";
    
            for(;;)
            {
                // do some work
                unique_lock<mutex> lk(mx);
                if (cv.wait_for(lk, chrono::milliseconds(10), [this] { return canceled; }))
                    break;
            }
    
            cout << __PRETTY_FUNCTION__ << " done\n";
        }
    };
    
    int main()
    {
        workers demo;
        std::thread t1(&workers::thread1, ref(demo));
        std::thread t2(&workers::thread2, ref(demo));
    
        t1.join();
        t2.join();
    }
    

    输出:

    void workers::thread1() start
    void workers::thread2() start
    void workers::thread1() signaling cancel
    void workers::thread2() done
    void workers::thread1() done
    

    更新 带有 boost 的 C++03 版本现在也是 Live On Coliru。为了好玩,我添加了时间戳:

    thread1:21 2014-Mar-26 00:01:40.074269 start
    thread2:37 2014-Mar-26 00:01:40.074275 start
    thread1:26 2014-Mar-26 00:01:42.074873 signaling cancel
    thread2:47 2014-Mar-26 00:01:42.074991 done
    thread1:32 2014-Mar-26 00:01:44.075062 done
    

    【讨论】:

    • 更新 带有 boost 的 C++03 版本现在也是 Live On Coliru。 (我在输出中添加了时间戳作为奖励)
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2010-10-09
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多