c++多线程 关于join()

img


join的作用就是暂时阻塞主线程,从而使得子线程能够在主线程结束之前执行完,我这里想用一个fir循环延长主进程进度从而也达到让子线程在主线程结束之前执行完,但是报错了,是不是必须得用join?

join会导致调用线程,也就是你这里的main线程阻塞,但阻塞并不是目的,join(连接)子线程的目的是为了回收已经退出的子线程资源。如果不回收资源,就会导致资源无法释放。
回收已经退出的子线程资源,可以join,也可以detach(分离线程),让退出线程自动释放资源。
如果是在linux系统下面使用join方式,还可以阻塞main线程或者运行loop循环,用signal机制通知main调用join回收子线程资源。

如果使用detach方式,main线程和子线程就是两个独立的线程了,可以使用互斥锁(std::mutex)、条件变量、信号量等方式进行线程同步。

这里以互斥锁 + 条件变量为例,让main线程等待子线程运行结束,再继续运行:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

using namespace std;

std::mutex mtx;
std::condition_variable cond;
bool subThreadExit = false;

void thread_func()
{
    printf("sub-thread start\n");
    std::this_thread::sleep_for(chrono::seconds(2)); // 休眠2秒, 便于观察

    printf("sub-thread exit\n");

    subThreadExit = true;
    cond.notify_one(); // 唤醒等待在条件变量上的线程
}

int main()
{
    printf("main-thread start\n");
    std::thread th1(thread_func);
    th1.detach();

    std::unique_lock<std::mutex> lockGuard(mtx);
    while (false == subThreadExit) {
        cond.wait(lockGuard);
    }

    printf("main-thread exit\n");
    return 0;
}

不是,可以用Sleep();
Sleep();
的括号中可以填数字,作用是暂停X秒继续执行下面的代码,
暂停的时间取决于括号中的数字;
1000=1秒;
2000=2秒
100=0.1秒
10=0.01秒
以此类推;
所以;
可以加上Sleep(100000);//暂停10秒再继续执行下面的代码;