当前位置: 首页 > wzjs >正文

高端网站设计 公司新鸿儒个人网站做得优秀的

高端网站设计 公司新鸿儒,个人网站做得优秀的,想做企业网站,wordpress 邮件功能std::thread是 C11 标准库中用于多线程编程的核心类,提供线程的创建、管理和同步功能。下面我们一一讲解。 一.构造函数 官网的构造函数如下: 1.默认构造函数和线程创建 thread() noexcept; 作用:创建一个 std::thread 对象,但…

        std::thread是 C++11 标准库中用于多线程编程的核心类,提供线程的创建、管理和同步功能。下面我们一一讲解。

一.构造函数

官网的构造函数如下:

1.默认构造函数和线程创建

thread() noexcept;

作用:创建一个 std::thread 对象,但不关联任何实际线程​(即空线程对象)。

如:

std::thread t;  // 空线程对象,不执行任何操作

注意:空线程对象不可调用 join() 或 detach(),需先绑定有效线程。

2.初始化构造函数

template <class Fn, class... Args>
explicit thread(Fn&& fn, Args&&... args);
  • 作用创建一个新线程,新线程会立即执行 fn(args...)函数
  • 参数
    • fn:可调用对象(函数、Lambda、函数对象等)。
    • args:传递给 fn 的参数

如: 

void print(int x) { std::cout << x; }
std::thread t(print, 42);  // 线程执行 print(42)
t.join();

这里要注意下面几点

  • explicit 禁止隐式类型转换(如避免误将函数指针转线程对象)。
  • 参数默认按值拷贝传递,若需传引用需用 std::ref
  • 示例:
int x = 42;
std::thread t([](int& v) { v++; }, std::ref(x));  // 传递引用

3.拷贝构造函数(被删除)​

thread(const thread&) = delete; 

  • 作用:禁止拷贝构造线程对象(线程资源不可复制)。
  • 示例:
  • std::thread t1([]{ /* ... */ });
    std::thread t2 = t1;  // 编译错误!拷贝构造被禁用
  • 原因:线程是独占资源,拷贝可能导致线程重复管理(如多次 join())。

 4.移动构造函数

thread(thread&& x) noexcept;
  • 作用:将线程所有权从 x 转移到新对象(x 变为空线程对象)。
  • 示例
    std::thread t1([]{ /* ... */ });
    std::thread t2 = std::move(t1);  // t1 变为空,t2 接管线程
    t2.join();

这里要注意下面几点:

  • 移动后,原线程对象 x 不再关联任何线程。
  • 用于将线程对象存入容器或转移所有权:std::vector<std::thread> threads; threads.push_back(std::thread([]{ /* ... */ })); // 必须用移动语义
std::vector<std::thread> threads;
threads.push_back(std::thread([]{ /* ... */ }));  // 必须用移动语义

 二.赋值运算符重载

1. 移动赋值运算符(Move Assignment)

thread& operator=(thread&& rhs) noexcept;

  • 关键行为
    • 当前对象会先释放自己原本持有的线程资源(如果存在)。
    • 接管 rhs 的线程所有权,rhs 变为空线程对象​(不再关联任何线程)。
    • 操作是原子的,且标记为 noexcept(保证不抛出异常)。
  • 示例
    std::thread t1([]{ /* 任务 1 */ });
    std::thread t2;
    t2 = std::move(t1);  // t1 的线程所有权转移给 t2,t1 变为空
    t2.join();
  • 典型用途
    • 将线程对象存入容器(如 std::vector<std::thread>)。
    • 动态管理线程所有权(如线程池)。

2. 拷贝赋值运算符(被删除)​

thread& operator=(const thread&) = delete;

  • 作用:​禁止拷贝赋值​(编译时报错)。
  • 原因
    • 线程是独占资源,拷贝会导致多个对象管理同一线程,引发重复 join() 或 detach()
    • 保证线程对象的唯一所有权,避免资源管理冲突。
  • 错误示例
    std::thread t1([]{ /* ... */ });
    std::thread t2;
    t2 = t1;  // 编译错误!拷贝赋值被禁用

  三.线程等待和线程分离

        线程等待就是让主线程等待子线程执行完毕,首先我们要明白为什么要进行线程等待

1.主线程是进程的入口,若主线程执行完毕,操作系统会直接终止整个进程(包括所有子线程),无论子线程是否完成任务。

2.子线程可能持有共享资源(如内存、文件句柄、网络连接),若主线程不等待子线程结束就退出,可能导致:资源泄漏​(如未关闭的数据库连接)和数据竞争​(子线程访问已被主线程释放的内存,导致崩溃)。

3.部分情况下线程执行计算或数据处理后,主线程需要汇总结果

        线程分离就是用于解除线程与其创建者(如主线程)的关联,使得子线程在终止后能够自动释放资源,无需其他线程显式调用 join() 等待或回收。

        下面我们就来讲解一下线程等待和线程分离函数join() 和 detach()

join():在主线程中调用阻塞主线程,直到当前线程执行完毕,就是让主线程等待子线程执行完毕

detach():分离线程,使其在后台独立运行(无法再管理)。

必须在 std::thread 对象销毁前调用 join() 或 detach(),否则程序终止。

std::thread t([]{ /* ... */ });if (t.joinable()) {t.join();   // 或 t.detach();
}

四.线程 ID 和命名

  • get_id():获取线程唯一标识符。
  • std::this_thread 命名空间提供当前线程操作。有get_id(),yield(),sleep_for()等操作。
std::thread t([]{ std::cout << "Thread ID: " << std::this_thread::get_id() << "\n";
});
std::cout << "Main thread ID: " << t.get_id() << "\n";
t.join();

五.线程中的同步机制

1. 互斥量 std::mutex

防止多个线程同时访问共享资源。

std::mutex mtx;
int counter = 0;void safe_increment() {std::lock_guard<std::mutex> lock(mtx); // 自动加锁解锁counter++;
}std::thread t1(safe_increment);
std::thread t2(safe_increment);
t1.join(); t2.join();

2. 条件变量 std::condition_variable

用于线程间的条件同步。

std::mutex mtx;
std::condition_variable cv;
bool ready = false;void wait_thread() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{ return ready; }); // 等待条件满足std::cout << "Ready!\n";
}void signal_thread() {std::this_thread::sleep_for(std::chrono::seconds(1));{std::lock_guard<std::mutex> lock(mtx);ready = true;}cv.notify_one(); // 通知等待线程
}std::thread t1(wait_thread);
std::thread t2(signal_thread);
t1.join(); t2.join();

六.实践操作:

用两个线程分别交替打印 1-100 的奇数和偶数,通过互斥锁和条件变量实现交替输出:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>using namespace std;int num = 1;                        // 共享计数器
mutex mtx;                          // 互斥锁
condition_variable cv;              // 条件变量
const int MAX_NUM = 100;            // 最大值void print_odd() {while (true) {unique_lock<mutex> lock(mtx);// 等待条件:数字为奇数或超过最大值cv.wait(lock, [] { return (num % 2 == 1) || (num > MAX_NUM); });if (num > MAX_NUM) break;cout << "Odd:  " << num << endl;num++;                      // 递增到偶数lock.unlock();cv.notify_all();            // 唤醒另一个线程}
}void print_even() {while (true) {unique_lock<mutex> lock(mtx);// 等待条件:数字为偶数或超过最大值cv.wait(lock, [] { return (num % 2 == 0) || (num > MAX_NUM); });if (num > MAX_NUM) break;cout << "Even: " << num << endl;num++;                      // 递增到奇数lock.unlock();cv.notify_all();            // 唤醒另一个线程}
}int main() {thread t1(print_odd);thread t2(print_even);t1.join();t2.join();return 0;
}

运行结果

        c++的线程就讲到这里,有帮助的话就点点赞吧。

http://www.dtcms.com/wzjs/569836.html

相关文章:

  • 做哪个网站的人多网站一般如何做搜索功能
  • 外贸西班牙语网站建设前端开发岗位介绍
  • 网站建设及安全规范搭建视频播放网站
  • 福田企业网站优化有用吗广州网站建立
  • 广东企业备案 网站建设方案书wordpress域名设置方法
  • 网站百度不收录的原因为什么简洁网站会受到用户欢迎
  • php网站开发答案新加坡网络公司排名
  • 网站建设职业去哪里上班如何建设网站简介
  • 孔家庄网站建设个人网站备案 淘宝客
  • 网站建设公司的岗位职责资源收费网站怎么做
  • 南京建设厅官方网站网站 mysql数据库 字符
  • 个人网站搭建平台呼叫中心网站建设
  • 泰安口碑好的企业建站公司微信群推广佣金平台
  • 可以在线编程的网站近期即将上市的手机
  • 免费用手机建立网站天津注册公司流程和费用标准
  • 网站建设宀金手指花总十四专业做网站建设公司
  • 做网站是如何赚钱的国泰君安官方网站建设集团
  • 做一个多肉网站可以做哪些内容wordpress admin 500
  • 遵义 网站建设学校网站建设工作会议
  • 企业网站为什么要备案膳食管理东莞网站建设技术支持
  • 官方网站建设的四个步骤动态页网站
  • 企业做网站服务费网站换主题
  • 个人网站设计与实现源码濮阳seo网站建设
  • 王璞网站开发实战答案朔州网络推广
  • 可以自己做logo的网站泉州网站关键词推广费用
  • 钓鱼网站怎么搭建app扁平化设计网站
  • 长春建设集团招聘信息网站新手怎么做跨境电商
  • 重庆建一个网站大概要多少钱网站描文本
  • 建网站哪家划算网站建设众包平台
  • 长沙环路建设开发有限公司网站北京微网站开发