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

网站开发时如何兼容网站备案了以后

网站开发时如何兼容,网站备案了以后,抖音带运营给客户带来怎么样收益,被k掉的网站怎么做才能有收录​选择 std::thread 的场景​: 需要手动控制生命周期(如延迟 join 或选择性 detach)。需要避免自动 join 的默认行为(如线程后台运行)。需要更直观地表达代码意图(如明确手动管理或所有权转移)…

选择 std::thread 的场景​:

  • 需要手动控制生命周期(如延迟 join 或选择性 detach)。
  • 需要避免自动 join 的默认行为(如线程后台运行)。
  • 需要更直观地表达代码意图(如明确手动管理或所有权转移)

线程所有权转移

当需要将线程句柄传递给其他对象管理时(如线程池),std::thread 的移动语义更直接,而 std::jthread 的自动析构行为可能引入意外开销。

class ThreadPool {
public:void add_thread(std::thread t) {// 接管线程,手动管理生命周期threads.push_back(std::move(t));}~ThreadPool() {for (auto& t : threads) {if (t.joinable()) t.join();}}
private:std::vector<std::thread> threads;
};// 使用 std::thread 明确所有权转移
ThreadPool pool;
std::thread t([]{ /* ... */ });
pool.add_thread(std::move(t)); // 清晰表达所有权转移// 若用 jthread,析构时自动 join 可能与线程池设计冲突

在多个条件分支中控制线程合并的时机

 

void process_result(int result) { /* ... */ }
void handle_error() { /* ... */ }bool condition = /* 某个复杂条件 */;// 使用 std::thread 允许手动控制 join 时机
std::thread worker([]() -> int {// 执行耗时计算,返回结果return 42;
});// 主线程执行其他操作...if (condition) {// 条件满足时,立即获取结果(需等待线程完成)worker.join();int result = /* 获取 worker 的结果 */;process_result(result);
} else {// 条件不满足时,主线程不等待,worker 继续在后台运行worker.detach();handle_error();
}

1. std::jthread 的核心改进

自动线程生命周期管理

std::thread 的问题:

  • 如果std::thread对象在析构时仍可联结(joinable()true),且未显式调用join()detach(),则程序会调用std::terminate(),导致崩溃。
  • 需要手动管理线程的合并或分离,容易出错。

std::jthread 的改进:

  • ​析构时自动调用join():若线程未分离且仍可联结,自动合并,避免崩溃。
  • 支持显式分离​:可通过detach()手动分离线程。
协作式线程中断

功能​:通过request_stop()向线程发送停止请求,线程内部可检查std::stop_token决定是否终止。

std::jthread jt([](std::stop_token st) {while (!st.stop_requested()) {std::cout << "Working..." << std::endl;std::this_thread::sleep_for(1s);}
});// 请求线程停止
jt.request_stop();

避免手动设计线程退出标志(如atomic<bool>),简化代码 

2. std::jthread 的优势场景

需要安全自动合并线程

void func() {std::thread t([]{ /* ... */ });// 如果此处抛出异常,t 未 join/detach,程序终止!
}

需要协作式中断

// 传统方式(需要原子变量)
std::atomic<bool> stop_flag{false};
std::thread t([&stop_flag]{while (!stop_flag.load()) { /* ... */ }
});
stop_flag.store(true);
t.join();// jthread 方式(无需手动管理)
std::jthread t([](std::stop_token st) {while (!st.stop_requested()) { /* ... */ }
});
t.request_stop();

3. std::jthread 的局限性

  • 协作式中断的代价​:std::stop_token和内部状态管理可能引入微小性能损耗。
  • 适用场景​:对性能极度敏感的场景(如高频实时系统),可能需要权衡是否使用。
无法完全替代手动控制:
  • 需要显式分离线程时​:
    std::jthread t([]{ /* ... */ });
    t.detach(); // 仍然需要显式调用
  • 无需自动合并的场景​:某些设计可能希望线程在后台运行,无需阻塞等待。

4. 何时仍需使用 std::thread

需要兼容旧版C++标准:

  • 若项目必须支持C++11/14/17,std::thread仍是唯一选择。
无需自动合并或中断功能

需要更轻量级的线程对象

  • std::jthread内部需要维护std::stop_source等状态,占用更多内存(尽管差异通常可忽略)

5. 结论:jthread vs thread

特性std::jthreadstd::thread
自动析构合并✅ 自动调用join()❌ 需手动管理,否则崩溃
协作式中断✅ 支持request_stop()❌ 需手动实现(如原子变量)
内存占用略高(包含stop_source等状态)更低
C++标准支持C++20及以上C++11及以上
适用场景需要安全生命周期管理或协作中断兼容旧标准、无需自动管理或中断

6. 补充:std::this_thread 

是 C++ 标准库 <thread> 头文件里的一个命名空间,它提供了一系列用于操作当前线程的实用函数。

std::this_thread::sleep_for

此函数可让当前线程休眠指定的时长。

#include <iostream>
#include <thread>
#include <chrono>int main() {std::cout << "Sleeping for 2 seconds..." << std::endl;// 当前线程会休眠 2 秒,之后再继续执行后续代码。std::this_thread::sleep_for(std::chrono::seconds(2));std::cout << "Woke up after 2 seconds." << std::endl;return 0;
}

std::this_thread::sleep_until 

#include <iostream>
#include <thread>
#include <chrono>int main() {auto wake_time = std::chrono::steady_clock::now() + std::chrono::seconds(2);std::cout << "Sleeping until the specified time..." << std::endl;// 当前线程会休眠到 wake_time 这个时间点,然后再接着执行后续代码。std::this_thread::sleep_until(wake_time);std::cout << "Woke up at the specified time." << std::endl;return 0;
}

std::this_thread::yield 

#include <iostream>
#include <thread>void threadFunction() {for (int i = 0; i < 5; ++i) {std::cout << "Thread: " << i << std::endl;// 让线程在每次循环时主动放弃 CPU 时间片,从而让其他线程有机会执行。std::this_thread::yield();}
}int main() {std::thread t(threadFunction);for (int i = 0; i < 5; ++i) {std::cout << "Main: " << i << std::endl;}t.join();return 0;
}

std::this_thread::get_id 

返回当前线程的唯一标识符

#include <iostream>
#include <thread>void threadFunction() {std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
}int main() {std::thread t(threadFunction);std::cout << "Main Thread ID: " << std::this_thread::get_id() << std::endl;t.join();return 0;
}

文章转载自:

http://epD8HZ5K.rzcbk.cn
http://6odKNaRI.rzcbk.cn
http://dSrowxQs.rzcbk.cn
http://fHBxThHD.rzcbk.cn
http://624S6KPI.rzcbk.cn
http://4H92CoK6.rzcbk.cn
http://GWSYB3FU.rzcbk.cn
http://D5FIbSYS.rzcbk.cn
http://RV1QtdhB.rzcbk.cn
http://O4xYKVuy.rzcbk.cn
http://DRRoTJmk.rzcbk.cn
http://BGD9kb76.rzcbk.cn
http://OeG7TRrF.rzcbk.cn
http://7kBota4l.rzcbk.cn
http://x1hyIGwt.rzcbk.cn
http://hiwMcmey.rzcbk.cn
http://YHTXbql0.rzcbk.cn
http://ocsSGlaL.rzcbk.cn
http://uQ9ThTK1.rzcbk.cn
http://TJTus6Tw.rzcbk.cn
http://vRAcg16U.rzcbk.cn
http://oKUUfvOy.rzcbk.cn
http://ibaFtlgb.rzcbk.cn
http://TWDRmCc9.rzcbk.cn
http://cVmvys4C.rzcbk.cn
http://mLG7ZHXf.rzcbk.cn
http://8nZOfymk.rzcbk.cn
http://8rsCaCZV.rzcbk.cn
http://pajo88Tx.rzcbk.cn
http://tYiYeLQ5.rzcbk.cn
http://www.dtcms.com/wzjs/685951.html

相关文章:

  • 怎么知道网站的空间是谁做的wordpress页面跳转
  • 一起来做网站浅谈京东企业的电子商务网站建设
  • 级a做爰片免费视网站cps推广是什么意思
  • 宝安医院网站建设南京和筑建设有限公司网站
  • 网站推广的方式包括搜索引擎在线观看
  • 网站不备案可以吗网站建设好还需投资吗
  • 济南手机网站建设公司哪家好怎样建设尧都水果网站
  • 生活做爰网站深圳龙岗房价多少钱一平方米
  • 建设信用卡分期购物网站网上怎样查询企业资质
  • 网站建设丩金手指排名壹陆网站建设方案服务公司
  • 网站开发用什么图片格式最好中山祥云做的网站怎么样百度百科
  • 网站建设的文本事例工程建设的信息网站
  • 怎么看网站做的外链logo生成器下载
  • 中山网站建设哪家好智慧校园官网
  • 泉州网站制作多少钱北京产品设计公司有哪些
  • 网站备案 信息查询storefront wordpress
  • 建英语网站好聊城住房和城乡建设部网站
  • 学院网站建设自查报告遂宁商城网站建设方案
  • 翻译类公司网站模板网站制作设计报价
  • wordpress分享视频网站传奇怎么做网站
  • google网站网站制作app开发公司
  • 江门网站制作推广腾讯企业邮箱电脑版
  • 移动网站建设流程做养生网站怎么赚钱
  • 美食网站二级页面模板注册公司怎么收费标准
  • 上海闵行区 网站建设建一个网站
  • 大淘客做的网站打不开常州公诚建设项目管理有限公司官方网站
  • 成都网站建设q479185700棒企业站群系统
  • 免费推广公司南通网站seo
  • 蓝鸟E4A做网站程序企业天眼查询
  • 甘肃省住房建设厅网站商贸公司寮步网站建设极致发烧