首页 > 编程语言 >c++ 多线程摘记

c++ 多线程摘记

时间:2023-04-10 14:57:26浏览次数:44  
标签:std include thread c++ 互斥 线程 摘记 多线程

有没有 linux 和 windows 通用的 多线程库?

ChatGPT:

是的,C++11 标准引入了一个名为 std::thread 的多线程库,它可以在 Windows 和 Linux 上使用。std::thread 库提供了一种方便的方式来创建和管理线程,包括启动、等待、终止和同步线程。此外,它还提供了一些便利的功能,例如线程局部存储和异步执行任务等。

使用 std::thread 需要包含 <thread> 头文件,示例代码如下:

#include <iostream>
#include <thread>

void myThreadFunc(int i)
{
    std::cout << "Thread " << i << " started." << std::endl;
}

int main()
{
    std::thread t1(myThreadFunc, 1);
    std::thread t2(myThreadFunc, 2);

    t1.join();
    t2.join();

    return 0;
}

这个例子创建了两个线程,每个线程都调用 myThreadFunc 函数,并传递不同的参数。主线程等待两个线程都完成之后才会结束。

std::thread 如何实现线程互斥锁?
ChatGPT:

在C++11标准中,提供了 std::threadstd::mutex 两个类来实现多线程和互斥锁。

下面是一个使用 std::threadstd::mutex 实现线程互斥锁的示例代码:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

void thread_function(int id)
{
    mtx.lock();
    std::cout << "Thread " << id << " starts working." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "Thread " << id << " finishes working." << std::endl;
    mtx.unlock();
}

int main()
{
    std::thread t1(thread_function, 1);
    std::thread t2(thread_function, 2);

    t1.join();
    t2.join();

    return 0;
}

在上面的示例代码中,使用了 std::mutex 类来创建互斥锁。在 thread_function 函数中,调用了 mtx.lock() 来锁定互斥锁,使得只有一个线程可以进入临界区。在临界区内,线程会执行一些操作,然后再调用 mtx.unlock() 来释放互斥锁,以便其它线程可以进入临界区。最后,在主函数中,调用了 t1.join()t2.join() 来等待两个子线程的执行结束。

需要注意的是,在使用互斥锁时,需要确保每个线程都能够正确地获取和释放锁,否则就会出现死锁或者竞态条件等问题。

标签:std,include,thread,c++,互斥,线程,摘记,多线程
From: https://www.cnblogs.com/nanfei/p/17302907.html

相关文章

  • C++派生类里析构函数和构造函数的调用顺序
    C++派生类里析构函数和构造函数的调用顺序1.定义一个哺乳类Mammal,在由此派生出狗类Dog,定义一个Dog类的对象,观察基类和派生类的构造函数与析构函数的调用顺序。#include<bits/stdc++.h>usingnamespacestd;classMammal{public: Mammal(){ cout<<"constructedM"<<e......
  • 《c++徒步》MFC篇——MFC基础知识
    MFC简介原文链接:https://www.cnblogs.com/zhouwanqiu/p/6914090.html1、什么是MFC?全称:MicrosoftFoundationClassLibrary(微软基础类库)1-MFC从硬盘存在形式来说就是一个库(静态MFC库、动态MFC库)2-MFC从原理来说还是一个程序框架2、为什么使用MFC?基于框架编程,提高工作效......
  • c++遍历容器元素
    for(autoi:v)遍历容器元素1.auto2.auto&3.constauto&4.constautoC++11新增了一种循环:基于范围(range-based)的for循环。这简化了一种常见的循环任务:对数组(或容器类,如vector和array的每个元素执行相同的操作,如下例所示:doubleprices[5]={4.99,10.99,6......
  • 介绍几种等待多线程任务执行完毕的方法
    一.引言:在我们日常的开发过程中,我们经常会开启多个线程或者创建一个线程池去执行多个并发任务,当所有任务执行完毕后,我们一般会做一个统一的处理。那我们如何知道多个线程的任务已经全部执行完毕了呢?今天由我来为大家介绍几种方法:二.join()方法在这里插入图片描述......
  • C++标准输入输出
    一、问题引入关于C和C++的输入输出区别,虽然在C++中仍然可以使用scanf和printf,但建议使用cin和cout。虽然使用不同的函数得到的结果一样,但仔细检测发现,cin和cout没有格式控制符了,意味着输入更简单了二、解决过程#include<iostream>usingnamespacestd;intmain(......
  • C++指针
    指针指针的基本概念1、指针的作用:可以通过指针间接访问内存(指针就是内存地址)内存编号是从0开始记录的,一般用16进制数字表示可以利用指针变量保存地址指针变量定义的语法#include<iostream>usingnamespacestd;intmain(){ //1、定义指针 inta=10......
  • 多线程下载m3u8分段视频
    1.说明m3u8是一种传输数据的方式,比如说一集20分钟的完整视频被分割成一千多段一两秒的小视频,客户端播放的时候是感觉是连续,但如果你要下载这集视频,那就要把一千多个小视频全都下载然后自己拼接成一个完整视频。拼接的话很简单,像格式工厂等很多软件都可以轻松完成,但要一个一个下载......
  • C++-Ubuntu core dumped(核心已转储)-GDB调试
    C++-Ubuntucoredumped(核心已转储)-GDB调试Linux的可执行程序异常退出时,提示“核心已转储”。此时需要系统生成core文件,并通过GDB调试以确定问题。https://blog.csdn.net/scjdas/article/details/128585787设置系统生成core文件用ulimit-a查看corefilesize项是否......
  • java并发编程(2):Java多线程-java.util.concurrent高级工具
    高级多线程控制类Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent,提供了大量高级工具,可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。ThreadLocal类ThreadLocal类用来保存线程的独立变量。对一个线程类(继承自Thread)当使用ThreadLocal维护变......
  • java并发编程(1):Java多线程-基本线程类-基础知识复习笔记
    复习资料:《同步与异步:并发/并行/进程/线程/多cpu/多核/超线程/管程 》基本线程类基本线程类基本线程类指的是Thread类,Runnable接口,Callable接口继承Thread创建线程继承java.lang.Thread类创建线程是最简单的一种方法,也最直接。publicclassMyThread1extendsThread{}种......