21xrx.com
2024-12-22 18:49:20 Sunday
登录
文章检索 我的文章 写文章
Linux下C++多线程编程实例
2023-07-12 18:19:31 深夜i     --     --
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++多线程编程的基础知识。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复