21xrx.com
2025-06-04 06:36:28 Wednesday
登录
文章检索 我的文章 写文章
Linux下C++多线程编程实例
2023-07-12 18:19:31 深夜i     18     0
Linux C++ 多线程编程 实例 并发编程

在Linux下,C++多线程编程是非常常见的,它能够让程序在执行过程中同时进行多个任务,提高程序的效率和响应速度。本文将介绍一个基本的多线程编程实例,帮助大家理解和掌握如何在Linux下进行C++多线程编程。

1. 创建线程

在Linux下,创建线程需要使用pthread库,具体步骤如下:

#include <pthread.h>
void *function(void *args)
  // 线程执行的代码
pthread_t thread_id;
int ret = pthread_create(&thread_id, NULL, function, NULL);
if (ret != 0) {
  printf("线程创建失败");
  exit(-1);
}

以上代码创建了一个新线程,线程执行的代码为function函数。

2. 线程同步

线程同步是指多个线程之间的协调与合作,避免出现竞争和死锁等问题。常用的线程同步方法有互斥锁(mutex)和信号量(semaphore)。

2.1 互斥锁

互斥锁是一种用于线程同步的工具,它用于保护一个共享资源,以确保同一时间只能有一个线程访问它。在C++中,互斥锁需要使用pthread_mutex_t结构体来进行定义和初始化。

#include <pthread.h>
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);

以上代码定义了一个互斥锁mutex,并进行了初始化。为了保护资源,需要在访问共享资源之前进行加锁操作,在访问结束后进行解锁操作。

pthread_mutex_lock(&mutex);
// 访问共享资源
pthread_mutex_unlock(&mutex);

以上代码展示了加锁和解锁的操作。

2.2 信号量

信号量也是一种用于线程同步的工具,它用于控制并发线程的数量。信号量有两种类型:二元信号量和计数信号量。在C++中,通常使用sem_t结构体来进行信号量的定义和初始化。

#include <semaphore.h>
sem_t sem;
sem_init(&sem, 0, 1);

以上代码定义了一个计数信号量sem,并进行了初始化。在访问共享资源之前,需要进行信号量的等待操作,等到资源可用后再进行访问。访问结束后,需要进行信号量的释放操作。

sem_wait(&sem);
// 访问共享资源
sem_post(&sem);

以上代码展示了信号量的等待和释放的操作。

3. 完整实例

下面给出一个完整的多线程编程实例,其中包括了线程的创建、互斥锁和信号量的使用。

#include <iostream>
#include <thread>
#include <mutex>
#include <semaphore.h>
int sum = 0; // 全局变量,需要保护
std::mutex mutex; // 互斥锁
sem_t sem; // 信号量
void add() {
  sem_wait(&sem); // 等待信号量
  mutex.lock(); // 加锁
  for (int i = 0; i < 1000000; i++) {
    sum++;
  }
  mutex.unlock(); // 解锁
  sem_post(&sem); // 释放信号量
}
int main() {
  sem_init(&sem, 0, 5); // 初始化信号量,最多允许5个线程同时访问共享资源
  std::thread threads[10];
  for (int i = 0; i < 10; i++) {
    threads[i] = std::thread(add);
  }
  for (auto& thread : threads) {
    thread.join();
  }
  std::cout << "sum: " << sum << std::endl;
  sem_destroy(&sem); // 销毁信号量
  return 0;
}

以上代码创建了10个线程,每个线程对全局变量sum进行1000000次加1操作,同时使用了互斥锁和信号量来保证线程安全和资源的共享。

本文介绍了C++在Linux下的多线程编程实例,其中包括了线程的创建和同步方法的使用。希望本文能够帮助大家学习和掌握C++多线程编程的基础知识。

  
  

评论区