linux使用线程
在linux使用线程可能出现,在编译时不会报错,但执行出错的问题。
undefined reference to `pthread_create'
这是由于ubuntu平台下调用pthread_create()函数,pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,在运行时加上参数“-lpthread”即可。
如果使用vscode运行的话,在项目的tasks.json的args中添加“-lpthread”即可。
线程示例
以一个示例来讲解:
在用户未输入时,在控制台持续输出working,在用户输入后结束输出working并提示。
可以启用两个线程,其中主线程用于接受用户输入,另一个线程负责打印working。为了防止打印过多,可以使用等待睡眠。
join()函数的含义是等待该线程结束后主线程再继续执行。
整个流程:
先输出主线程id,然后调用线程worker。
在执行线程worker时,首先会打印一下当前worker的线程id,当主线程收到用户输入后,s_Finished变为true,worker会终止循环。
此时main函数中由于join()函数存在,因此只会等worker结束以后才会继续执行(被阻塞)。当收到用户输入后,worker结束,因此worker.get_id()没有线程编号。
最后的主线程id与最开始一致。
static bool s_Finished = false;
void DoWork()
{
// sleep_for需要的命名空间
using namespace std::literals::chrono_literals;
// 以我的输出为例:Started thread id= 140737348151040
std::cout << "Started thread id= " << std::this_thread::get_id() << std::endl;
while(!s_Finished)
{
std::cout << "working.." << std::endl;
std::this_thread::sleep_for(1s);
}
}
int main()
{
// Doing thread 140737348155200
std::cout << "Doing thread " << std::this_thread::get_id() << std::endl;
std::thread worker(DoWork);
std::cin.get();
s_Finished = true;
worker.join();
// Thread thread::id of a non-executing thread finished.
std::cout << "Thread " << worker.get_id()<< " finished." << std::endl;
// Doing thread 140737348155200
std::cout << "Doing thread " << std::this_thread::get_id() << std::endl;
}
输出顺序如下:
Doing thread 140737348155200
Started thread id= 140737348151040
working..
working..
Thread thread::id of a non-executing thread finished.
Doing thread 140737348155200
如果不使用线程的话,cin会一直等待用户输入,进而阻塞了打印working,因此这类情景使用多线程会很友好。(例如等待用户输入的时候输出一些实时日志等)