c++的多线程详解

简介: c++的多线程详解

认识多线程

多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理。

动手编写多线程

创建线程

用 CreateThread()创建一个线程。
//返回值:一个HANDLE类型的值,表示线程的句柄,可用于等待线程等函数

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes, // 一般设置为NULL
  SIZE_T                  dwStackSize,        // 堆栈大小,不重要,一般设置为0,表示使用默认堆栈大小
  LPTHREAD_START_ROUTINE  lpStartAddress,     // 函数指针,传入函数名或指针即可
  __drv_aliasesMem LPVOID lpParameter,        // 参数指针,供函数使用
  DWORD                   dwCreationFlags,    // 一般设置为0
  LPDWORD                 lpThreadId          // 指针,用于保存线程的id,一般设置为NULL
);]

使用方法

// 声明线程函数的模板:
DWORD WINAPI threadname(LPVOID lpParamter) // 函数名字可随意
{
    /*
    这里填入你的代码
    */
    return 0L;
}

// 根据声明的函数创造一个线程
// 若函数没有参数,传入函数名字即可,其它参数参考下方示例
 HANDLE hThread = CreateThread(NULL, 0, threadname, NULL, 0, NULL);

实例

#include<iostream>
#include<windows.h>

using namespace std;

// 编写了一个我的线程函数
DWORD WINAPI MyThread1(LPVOID lpParamter)
{
        while(1)
        {
            cout << "MyThread1\n";
        }
    return 0L;
}

DWORD WINAPI MyThread2(LPVOID lpParamter)
{
     while(1)
        {
            cout << "MyThread2\n";
        }
    return 0L;
}

int main ()
{
    // 创造线程
    CreateThread(NULL, 0, MyThread1, NULL, 0, NULL);
        CreateThread(NULL, 0, MyThread2, NULL, 0, NULL);
    return 0;
}

上面的实例会出现的效果是1和2间隔出现。我们创建了线程1函数MyThread1和线程2函数MyThread2。但是这里要注意的是他们1和2出现是无规律的间隔。因为他们不会等待,只会自己执行自己的东西。所以他们的输出是无规律的,也是不可猜测的。他们运行的结果每一次都有可能不一样。

多线程应用场景

什么时候需要用到多线程呢?当我们不想因为阻塞而停下程序运行的时候,我们就可以用到多线程。python中的多线程多用于爬虫,为了增加爬虫程序的性能,更快的爬取内容。而c++的多线程可以应用在游戏程序上面。你想一下,要是一个玩家的游戏操作可以卡顿其他玩家,这个是多么糟糕的结果。所以一般c++用做服务器后端,都会用上多线程这一种技术的。

想要更深入了解多线程,得到更多源码案例的话。请移步到公众号:诗一样的代码

相关文章
|
5月前
|
存储 Java 程序员
C++多线程编程基础
C++多线程编程基础
44 2
|
2月前
|
Java 调度
基于C++11的线程池
基于C++11的线程池
|
3月前
|
算法 编译器 C++
开发与运维线程问题之在C++的原子操作中memory_order如何解决
开发与运维线程问题之在C++的原子操作中memory_order如何解决
35 2
|
2月前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
2月前
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
3月前
|
Rust 安全 程序员
Rust与C++的区别及使用问题之Rust解决多线程下的共享的问题如何解决
Rust与C++的区别及使用问题之Rust解决多线程下的共享的问题如何解决
|
3月前
|
Rust 编译器 程序员
Rust与C++的区别及使用问题之Rust避免多线程中的lifetime的问题如何解决
Rust与C++的区别及使用问题之Rust避免多线程中的lifetime的问题如何解决
|
4月前
|
存储 设计模式 安全
C++一分钟之-并发编程基础:线程与std::thread
【6月更文挑战第26天】C++11的`std::thread`简化了多线程编程,允许并发执行任务以提升效率。文中介绍了创建线程的基本方法,包括使用函数和lambda表达式,并强调了数据竞争、线程生命周期管理及异常安全等关键问题。通过示例展示了如何用互斥锁避免数据竞争,还提及了线程属性定制、线程局部存储和同步工具。理解并发编程的挑战与解决方案是提升程序性能的关键。
69 3
|
4月前
|
安全 程序员 C++
C++一分钟之-原子操作与线程安全
【6月更文挑战第27天】**C++的`std::atomic`提供线程安全的原子操作,解决多线程数据竞争。涵盖原子操作概念、应用、问题与对策。例如,用于计数器、标志位,但选择数据类型、内存顺序及操作组合需谨慎。正确使用能避免锁,提升并发性能。代码示例展示自旋锁和线程安全计数。了解并恰当运用原子操作至关重要。**
68 1
|
4月前
|
存储 Linux C语言
c++进阶篇——初窥多线程(二) 基于C语言实现的多线程编写
本文介绍了C++中使用C语言的pthread库实现多线程编程。`pthread_create`用于创建新线程,`pthread_self`返回当前线程ID。示例展示了如何创建线程并打印线程ID,强调了线程同步的重要性,如使用`sleep`防止主线程提前结束导致子线程未执行完。`pthread_exit`用于线程退出,`pthread_join`用来等待并回收子线程,`pthread_detach`则分离线程。文中还提到了线程取消功能,通过`pthread_cancel`实现。这些基本操作是理解和使用C/C++多线程的关键。
下一篇
无影云桌面