品牌手表网站,html5布局wordpress,制作网站要花多少钱如何,校内 实训网站 建设2.3 detach()detach() 函数的作用是进行线程分离#xff0c;分离主线程和创建出的子线程。在线程分离之后#xff0c;主线程退出也会一并销毁创建出的所有子线程#xff0c;在主线程退出之前#xff0c;它可以脱离主线程继续独立的运行#xff0c;任务执行完毕之后#x… 2.3 detach()detach() 函数的作用是进行线程分离分离主线程和创建出的子线程。在线程分离之后主线程退出也会一并销毁创建出的所有子线程在主线程退出之前它可以脱离主线程继续独立的运行任务执行完毕之后这个子线程会自动释放自己占用的系统资源。其实就是孩子翅膀硬了和家里断绝关系自己外出闯荡了如果家里被诛九族还是会受牵连。该函数函数原型如下void detach();线程分离函数没有参数也没有返回值只需要在线程成功之后通过线程对象调用该函数即可继续将上面的测试程序修改一下int main()
{cout 主线程的线程ID: this_thread::get_id() endl;thread t(func, 520, i love you);thread t1(func1);cout 线程t 的线程ID: t.get_id() endl;cout 线程t1的线程ID: t1.get_id() endl;t.detach();t1.detach();// 让主线程休眠, 等待子线程执行完毕this_thread::sleep_for(chrono::seconds(5));
}注意事项线程分离函数 detach () 不会阻塞线程子线程和主线程分离之后在主线程中就不能再对这个子线程做任何控制了比如通过 join () 阻塞主线程等待子线程中的任务执行完毕或者调用 get_id () 获取子线程的线程 ID。有利就有弊鱼和熊掌不可兼得建议使用 join ()。2.5 joinable()joinable() 函数用于判断主线程和子线程是否处理关联连接状态一般情况下二者之间的关系处于关联状态该函数返回一个布尔类型返回值为 true主线程和子线程之间有关联连接关系返回值为 false主线程和子线程之间没有关联连接关系bool joinable() const noexcept;示例代码如下#include
#include
#include
using namespace std;void foo()
{this_thread::sleep_for(std::chrono::seconds(1));
}int main()
{thread t;cout before starting, joinable: t.joinable() endl;t thread(foo);cout after starting, joinable: t.joinable() endl;t.join();cout after joining, joinable: t.joinable() endl;thread t1(foo);cout after starting, joinable: t1.joinable() endl;t1.detach();cout after detaching, joinable: t1.joinable() endl;
}示例代码打印的结果如下before starting, joinable: 0
after starting, joinable: 1
after joining, joinable: 0
after starting, joinable: 1
after detaching, joinable: 0基于示例代码打印的结果可以得到以下结论在创建的子线程对象的时候如果没有指定任务函数那么子线程不会启动主线程和这个子线程也不会进行连接在创建的子线程对象的时候如果指定了任务函数子线程启动并执行任务主线程和这个子线程自动连接成功子线程调用了detach()函数之后父子线程分离同时二者的连接断开调用joinable()返回false在子线程调用了join()函数子线程中的任务函数继续执行直到任务处理完毕这时join()会清理回收当前子线程的相关资源所以这个子线程和主线程的连接也就断开了因此调用join()之后再调用joinable()会返回false。2.6 operator线程中的资源是不能被复制的因此通过 操作符进行赋值操作最终并不会得到两个完全相同的对象。// move (1)
thread operator (thread other) noexcept;
// copy [deleted] (2)
thread operator (const other) delete;通过以上 操作符的重载声明可以得知如果 other 是一个右值会进行资源所有权的转移如果 other 不是右值禁止拷贝该函数被显示删除delete不可用3. 静态函数thread 线程类还提供了一个静态方法用于获取当前计算机的 CPU 核心数根据这个结果在程序中创建出数量相等的线程每个线程独自占有一个 CPU 核心这些线程就不用分时复用 CPU 时间片此时程序的并发效率是最高的。static unsigned hardware_concurrency() noexcept;示例代码如下#include
#include
using namespace std;int main()
{int num thread::hardware_concurrency();cout CPU number: num endl;
}4. C 线程库C 语言提供的线程库不论在 window 还是 Linux 操作系统中都是可以使用的看明白了这些 C 语言中的线程函数之后会发现它和上面的 C 线程类使用很类似其实就是基于面向对象的思想进行了封装但 C 的线程类用起来更简单一些链接奉上感兴趣的可以一看。声明本文于网络整理版权归原作者所有如来源信息有误或侵犯权益请联系我们删除或授权事宜。