c++11 语言级线程
线程的创建
用std::thread创建线程非常简单,只需要提供线程函数或函数对象即可,并且可以同时指定线程函数的参数。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
void func1()
{
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
std::cout << __FUNCTION__ << std::endl;
}
}
void func2()
{
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
std::cout << __FUNCTION__ << std::endl;
}
}
void func3(int a, char ch, const char *str)
{
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
std::cout << "a = " << a << std::endl;
std::cout << "ch = " << ch << std::endl;
std::cout << "str = " << str << std::endl;
}
void mytest()
{
std::thread t1(func1); // 子线程1
std::thread t2(func2); // 子线程2
// 线程还可以接收函数的参数
std::thread t3(func3, 1, 'a', "xyz"); //子线程3
std::thread t4(func3, 2, 'a', "abc"); //子线程3
while(true) // 主线程
{
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
std::cout << __FUNCTION__ << std::endl;
}
return;
}
int main()
{
mytest();
system("pause");
return 0;
}
回收线程资源
std::thread::join等待线程结束(此函数会阻塞),并回收线程资源,如果线程函数有返回值,返回值将被忽略。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
void puase_thread(int no, int n)
{
std::this_thread::sleep_for(std::chrono::seconds(n));
std::cout << "thread-" << no << " pause of " << n << " seconds" << std::endl;
}
void mytest()
{
//std::cout << "Spawning 3 threads..." << std::endl;
std::thread t1(puase_thread, 1, 3);
std::thread t2(puase_thread, 2, 3);
std::thread t3(puase_thread, 3, 3);
std::cout << "Done spawning threads. Now waiting for them to join:" << std::endl;
t1.joinable() ? t1.join() : std::cout << "Thread ID-" << t1.get_id() << " can not join" << std::endl;
t2.joinable() ? t2.join() : std::cout << "Thread ID-" << t2.get_id() << " can not join" << std::endl;
t3.joinable() ? t3.join() : std::cout << "Thread ID-" << t3.get_id() << " can not join" << std::endl;
std::cout << "All threads joined!" << std::endl;
return;
}
int main()
{
mytest();
system("pause");
return 0;
}
如果不希望线程被阻塞执行,可以调用线程的std::thread::detach(此函数不会阻塞),将线程和线程对象分离,让线程作为后台线程去执行。
但需要注意的是,detach之后就无法在和线程发生联系了,比如detach之后就不能再通过join来等待执行完,线程何时执行完我们也无法控制。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
void puase_thread(int no, int n)
{
std::this_thread::sleep_for(std::chrono::seconds(n));
std::cout << "thread-" << no << " pause of " << n << " seconds" << std::endl;
}
void mytest()
{
//std::cout << "Spawning 3 threads..." << std::endl;
std::thread t1(puase_thread, 1, 3);
std::thread t2(puase_thread, 2, 3);
std::thread t3(puase_thread, 3, 3);
std::cout << "Done spawning threads. Now waiting for them to join:" << std::endl;
t1.joinable() ? t1.detach() : std::cout << "Thread ID-" << t1.get_id() << " can not detach" << std::endl;
t2.joinable() ? t2.detach() : std::cout << "Thread ID-" << t2.get_id() << " can not detach" << std::endl;
t3.joinable() ? t3.detach() : std::cout << "Thread ID-" << t3.get_id() << " can not detach" << std::endl;
std::cout << "All threads joined!" << std::endl;
return;
}
int main()
{
mytest();
system("pause");
return 0;
}
获取线程ID和CPU核心数
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
void puase_thread(int n)
{
std::this_thread::sleep_for(std::chrono::seconds(n));
// std::this_thread::get_id() 获取线程ID
std::cout << "thread-" << std::this_thread::get_id() << " pause of " << n << " seconds" << std::endl;
}
void mytest()
{
//std::cout << "Spawning 3 threads..." << std::endl;
std::thread t1(puase_thread, 3);
std::thread t2(puase_thread, 3);
std::thread t3(puase_thread, 3);
std::cout << "main id: " << std::this_thread::get_id() << std::endl; // 主线程id
std::cout << "cpu num: " << std::thread::hardware_concurrency() << std::endl; // 获取cpu核心数,失败返回0
std::cout << "Done spawning threads. Now waiting for them to join:" << std::endl;
// t1.get_id() // 获取t1此线程的ID
t1.joinable() ? t1.detach() : std::cout << "Thread ID-" << t1.get_id() << " can not detach" << std::endl;
t2.joinable() ? t2.join() : std::cout << "Thread ID-" << t2.get_id() << " can not join" << std::endl;
t3.joinable() ? t3.join() : std::cout << "Thread ID-" << t3.get_id() << " can not join" << std::endl;
std::cout << "All threads joined!" << std::endl;
return;
}
int main()
{
mytest();
system("pause");
return 0;
}
原文链接: https://www.cnblogs.com/lsgxeva/p/7788976.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/262656
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!