网站排名 算法,营销网站更受用户欢迎的原因是,统计网站访问量,原则网站设计版式阅读导航 引言一、thread类的简单介绍二、线程函数详细介绍1. start() 函数#xff08;1#xff09;头文件#xff08;2#xff09;函数原型 2. join() 函数#xff08;1#xff09;头文件#xff08;2#xff09;函数原型 3. detach() 函数#xff08;1#xff09;头… 阅读导航 引言一、thread类的简单介绍二、线程函数详细介绍1. start() 函数1头文件2函数原型 2. join() 函数1头文件2函数原型 3. detach() 函数1头文件2函数原型3使用示例 4. get_id() 函数1头文件2函数原型3使用示例 5. joinable() 函数1头文件2函数原型3参数解释4返回值5使用示例 三、std::this_thread命名空间温馨提示 引言
当讨论现代编程语言的特性时C11无疑是一个不容忽视的里程碑。在前一篇文章中我们深入探讨了Lambda表达式在C11中的引入和应用。本文将继续探索C11的强大功能具体而言我们这篇文章将聚焦于线程库和其中的thread类。
线程在多任务处理中起着至关重要的作用它们允许程序同时执行多个任务从而提高效率和响应速度。在C11之前线程的处理相对复杂且容易出错。然而在C11中引入的thread类为我们带来了更加便捷和安全的线程管理方式。让我们一起深入研究C11线程库中的thread类探索多线程编程的无限潜力吧
一、thread类的简单介绍
thread的官方文档
thread类是C11引入的一个重要特性它位于thread头文件中并提供了一种简单而强大的方式来实现多线程编程。
使用thread类我们可以轻松地创建和管理线程。通过创建thread对象我们可以指定要执行的线程函数并传递所需的参数。一旦线程对象被创建我们可以使用它的成员函数来控制线程的生命周期如启动线程、等待线程完成、检查线程是否运行等。
⭕以下是thread类的一些常用成员函数
函数名功能构造函数用于创建线程对象并指定要执行的函数或可调用对象。start()启动线程的执行使线程进入就绪状态并开始运行。join()阻塞当前线程直到被调用的线程执行完毕。通常用于等待线程的结束并获取线程的返回值如果有。detach()将线程对象设置为分离状态使得线程无法被其他线程join()并在执行完毕后自动释放资源。get_id()返回线程的ID用于唯一标识一个线程。joinable()查询线程是否可执行即查询线程是否已经启动但未被join()。hardware_concurrency()返回当前系统支持的最大线程数通常与CPU核心数相同。
注意以上仅列举了thread类的部分常用成员函数还有其他一些成员函数和静态成员函数可供我们使用。同时在使用这些成员函数时我们需要注意线程安全性和同步机制以避免出现竞态条件和数据不一致的问题。
二、线程函数详细介绍
1. start() 函数
start()函数通常是由线程对象调用的用于开始执行一个新线程。
1头文件
start()函数在C标准库的thread头文件中进行声明。
2函数原型
start()函数的函数原型如下
void start();2. join() 函数
在C标准库中std::thread类提供了join()函数用于等待一个线程的结束并回收资源。
1头文件
join()函数在C标准库的thread头文件中进行声明。
2函数原型
join()函数的函数原型如下
void join();3. detach() 函数
detach()函数是std::thread类提供的一个成员函数用于将线程与std::thread对象分离使其成为一个独立的线程并在后台运行。
1头文件
detach()函数在C标准库的thread头文件中进行声明。
2函数原型
detach()函数的函数原型如下
void detach();3使用示例
下面是一个使用std::thread及其detach()函数的示例
#include iostream
#include threadvoid thread_func()
{std::cout Hello from new thread! std::endl;
}int main()
{std::thread t(thread_func); // 创建一个新线程并指定线程函数t.detach(); // 分离新线程std::cout Hello from main thread! std::endl;return 0;
}在上述示例中我们首先创建一个std::thread对象t并将一个线程函数thread_func作为参数传递给构造函数。然后我们通过调用t.detach()函数将新线程与std::thread对象分离。最后主线程输出“Hello from main thread!”。
在运行上述示例时将会看到如下输出
Hello from main thread!
Hello from new thread!由于我们在主线程中调用了t.detach()函数新线程成为一个独立的线程并在后台运行。因此在输出“Hello from main thread!”之后新线程才会输出“Hello from new thread!”。
4. get_id() 函数
get_id()函数是std::thread类提供的一个成员函数用于获取与std::thread对象相关联的线程的ID。
1头文件
get_id()函数在C标准库的thread头文件中进行声明。
2函数原型
get_id()函数的函数原型如下
std::thread::id get_id() const noexcept;3使用示例
下面是一个使用std::thread及其get_id()函数的示例
#include iostream
#include threadvoid thread_func()
{std::cout Thread ID: std::this_thread::get_id() std::endl;
}int main()
{std::thread t(thread_func); // 创建一个新线程并指定线程函数std::cout Main thread ID: std::this_thread::get_id() std::endl;t.join(); // 等待新线程结束return 0;
}在上述示例中我们首先创建一个std::thread对象t并将一个线程函数thread_func作为参数传递给构造函数。然后我们通过调用t.join()函数等待新线程结束。在新线程的线程函数中我们输出线程的ID。在主线程中我们也输出主线程的ID。
在运行上述示例时将会看到如下输出
Main thread ID: 140102324408064
Thread ID: 140102234146560由于我们在主线程中调用了std::this_thread::get_id()函数和新线程中的get_id()函数分别获取了主线程和新线程的ID。可以看到两个线程的ID是不同的。
5. joinable() 函数
joinable()函数是std::thread类提供的一个成员函数用于检查与std::thread对象关联的线程是否可以被join或detach。
1头文件
joinable()函数在C标准库的thread头文件中进行声明。
2函数原型
joinable()函数的函数原型如下
bool joinable() const noexcept;3参数解释
joinable()函数没有参数。调用该函数时将返回一个bool类型的值表示与std::thread对象相关联的线程是否可以被join或detach。
4返回值
joinable()函数返回值类型为bool。如果与std::thread对象相关联的线程可以被join或detach则返回true否则返回false。
5使用示例
下面是一个使用std::thread及其joinable()函数的示例
#include iostream
#include threadvoid thread_func()
{std::cout Hello from new thread! std::endl;
}int main()
{std::thread t(thread_func); // 创建一个新线程并指定线程函数std::cout Is thread joinable? t.joinable() std::endl; // 输出truet.join(); // 等待新线程结束std::cout Is thread joinable? t.joinable() std::endl; // 输出falsereturn 0;
}在上述示例中我们首先创建一个std::thread对象t并将一个线程函数thread_func作为参数传递给构造函数。然后我们通过调用t.joinable()函数检查与std::thread对象关联的线程是否可以被join或detach。在新线程结束之前该函数返回true。在调用t.join()函数等待新线程结束后该函数返回false。
三、std::this_thread命名空间
C11引入了std::this_thread命名空间其中包含了一些与当前线程相关的函数和属性。这些函数和属性以全局函数或静态成员函数的形式提供。
⭕以下是std::this_thread命名空间下的一些常用函数
函数名功能std::this_thread::get_id()获取当前线程的ID返回一个std::thread::id对象。std::this_thread::sleep_for()使当前线程休眠一段指定的时间。接受一个std::chrono::duration作为参数表示休眠的时间间隔。std::this_thread::yield()暂时放弃当前线程的执行允许其他线程运行。调用yield()后当前线程可能会被重新调度执行也可能继续让其他线程执行。
注意这些函数是与当前线程直接相关的而不是用于创建或管理线程的类。
温馨提示
感谢您对博主文章的关注与支持另外我计划在未来的更新中持续探讨与本文相关的内容会为您带来更多关于C以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新不要错过任何精彩内容
再次感谢您的支持和关注。期待与您建立更紧密的互动共同探索C、算法和编程的奥秘。祝您生活愉快排便顺畅