首页 > 编程语言 >C++:std::thread 和 pthread

C++:std::thread 和 pthread

时间:2024-09-01 11:51:49浏览次数:12  
标签:std thread C++ 线程 pthread include

        在C++中,线程的实现主要有两种方式:使用C++11标准库中的std::thread和POSIX线程库(pthread)。这两种方式各有优缺点,适用于不同的场景。以下是对这两种方式的详细比较和示例代码。

std::thread

示例代码

#include <iostream>
#include <thread>
#include <chrono>

void threadFunction() {    
    std::cout << "Thread is running" << std::endl;        
    std::this_thread::sleep_for(std::chrono::seconds(1));    
    std::cout << "Thread is finishing" << std::endl;
}

int main() {    
    std::thread t(threadFunction);    
    t.join(); // 等待线程完成    
    return 0;
}
  • 线程函数:threadFunction是一个简单的线程函数,打印消息并睡眠1秒。

  • 创建线程:使用std::thread创建线程,并传入线程函数。

  • 等待线程完成:使用join方法等待线程完成。

  • 优点

    • 更加现代化,符合C++11及以上标准。

    • 更加简洁和易于使用。

    • 与C++标准库的其他组件(如std::mutex、std::condition_variable等)无缝集成。

    • 跨平台支持更好。

  • 缺点

    • 在某些平台上,性能可能不如pthread。

    • 需要C++11及以上的编译器支持。

pthread

示例代码

#include <iostream>
#include <pthread.h>
#include <unistd.h>

void* threadFunction(void* arg) {    
    std::cout << "Thread is running" << std::endl;    
    sleep(1); // 睡眠1秒    
    std::cout << "Thread is finishing" << std::endl;    
    return nullptr;
}

int main() {    
    pthread_t t;    
    pthread_create(&t, nullptr, threadFunction, nullptr);    
    pthread_join(t, nullptr); // 等待线程完成    
    return 0;
}
  • 线程函数:threadFunction是一个简单的线程函数,打印消息并睡眠1秒。

  • 创建线程:使用pthread_create函数创建线程,并传入线程函数。

  • 等待线程完成:使用pthread_join函数等待线程完成。

  • 优点

    • 更加底层,提供了更多的控制和灵活性。

    • 在某些平台上,性能可能优于std::thread。

    • 广泛应用于Unix/Linux系统,成熟且稳定。

  • 缺点

    • 代码相对复杂,需要手动管理线程的创建和销毁。

    • 与C++标准库的其他组件集成不如std::thread方便。

    • 主要针对POSIX兼容系统,跨平台支持较差。

选择建议

  • 如果你正在开发一个现代C++应用程序,并且需要跨平台支持,建议使用std::thread。

  • 如果你需要更底层的控制,或者你的应用程序主要运行在POSIX兼容系统上,可以考虑使用pthread。

标签:std,thread,C++,线程,pthread,include
From: https://blog.csdn.net/weixin_53442127/article/details/141782216

相关文章

  • C++:std::this_thread::sleep_for 和 sleep
            在C++中,std::this_thread::sleep_for和sleep函数都可以用来使当前线程暂停执行一段时间,但它们有一些重要的区别。以下是对这两种方法的详细比较:std::this_thread::sleep_for定义:std::this_thread::sleep_for是C++11标准库中的一个函数,用于使当前线程暂停执......
  • C++面向对象编程(OOP)教程
    C++面向对象编程(OOP)教程在C++中,面向对象编程(OOP)是一种编程范式,它基于“对象”的概念来设计软件。OOP强调将数据(属性)和操作这些数据的方法(行为)封装在一起,形成对象。这种封装提高了代码的模块化、可重用性和可维护性。C++通过类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsu......
  • c++ STL常用容器使用(vector、deque、stack、queue、list、set、map等)
    1、vector使用动态数组,也叫可变数组,容器的空间是动态增长的,当空间不足时,申请更大一块空间,让后将原数据拷贝到新空间中,并释放原空间在这里插入图片描述1.1、初始化操作intarr[]={1,3,2,5};//1、方式一(初始化)vector<int>v1;//容器尾部插入数据v1.push_back(1);v1......
  • C++基础之指针(加精)
    指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。在这种情况下,只能通过指针来访问内存。在C语言中,可以用库函数malloc()来分配内存;在C++中仍然可以这样做,但C++还有更好的方法——new运算符。文章目录指针与数组深入探究探究一探究二探究三探究四探究五探......
  • opencv/c++的一些简单的操作(入门)
    目录读取图片读取视频读取摄像头图像处理腐蚀膨胀调整图像大小裁剪和缩放 绘制绘制矩形绘制圆形绘制线条透视变换颜色检测轮廓查找人脸检测检测人脸检测嘴巴可适当调整参数读取图片读取路径widows使用vissto一定是\斜杠#include<opencv2/imgcodec......
  • stdio.h及字符串输入输出
    这里只简单介绍常用的C语言常见的输入输出及字符串的输入输出,可以作为常用C语言字符串的速记收藏。#include<stdio.h>scanf //与空格,tab键及换行就阻断缓冲区printf //格式输入输出gets(数组名) //直到遇到换行键停止chararr[n];gets(arr);puts(数组名) //......
  • 前K个高频单词 C++
    给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。示例1:输入:words=["i","love","leetcode","i","love","coding"],k=2输出:["i","......
  • 【C++的创新性】C++11语法颠覆你的认知了吗?
    ​ 学习编程就得循环渐进,扎实基础,勿在浮沙筑高台   循环渐进Forward-CSDN博客Hello,这里是kiki,今天继续更新C++部分,我们继续来扩充我们的知识面,我希望能努力把抽象繁多的知识讲的生动又通俗易懂,今天要讲的是C++哈希~目录 循环渐进Forward-CSDN博客C++11简介......
  • 深入解析:如何在复杂 C++ 项目中高效集成 CMake 和 Conan
    目录标题第一章:C++项目中的Conan和CMake基础架构1.1项目架构概述1.2CMake与Conan的基本角色1.2.1CMake的角色1.2.2Conan的角色1.3在项目中合理结合使用CMake和Conan1.4实例分析1.5结语第二章:C++项目中的CMake和Conan实践2.1项目结构概览......
  • C++基础(1)——入门知识
    目录1.C++版本更新2.C++参考⽂档:3.C++书籍推荐4.C++的第⼀个程序5.命名空间5.1namespace的价值5.2namespace的定义5.3命名空间使⽤6.C++输⼊&输出7.缺省参数8.函数重载9.引⽤9.1引⽤的概念和定义9.2引⽤的特性9.3引⽤的使用9.4const引⽤ 9.5指针和引⽤的关......