C++实现线程同步的四种方式总结

C++实现线程同步的四种方式总结

多线程程序中,线程同步是一个非常重要的问题。为了保证多个线程的正确性和稳定性,我们需要采用线程同步措施,这样才能确保多个线程同时处理共享资源时不会出现数据读写冲突等问题。C++中实现线程同步主要有四种方式:互斥锁、条件变量、信号量和读写锁。

一、互斥锁(Mutex)

1. 互斥锁概念

互斥锁是最基本的线程同步机制。一段代码被互斥锁保护时,同一时间只有一个线程能够执行它。如果有其他线程在等待这个锁,那么它们会被阻塞,直到该锁被释放为止。pthread_mutex_t为互斥锁类型,可以通过pthread_mutex_init、pthread_mutex_lock、pthread_mutex_trylock、pthread_mutex_unlock等函数使用此类型进行相关的操作。

2. 示例

#include <pthread.h>
#include <stdio.h>

pthread_mutex_t mutex;

void* thread_func(void* data)
{
    // 加锁
    pthread_mutex_lock(&mutex);

    // do something

    // 释放锁
    pthread_mutex_unlock(&mutex);

    return NULL;
}

int main(int argc, char** argv)
{
    pthread_t thread;

    // 初始化互斥锁
    pthread_mutex_init(&mutex, NULL);

    // 创建线程
    pthread_create(&thread, NULL, thread_func, NULL);

    // 加锁
    pthread_mutex_lock(&mutex);

    // do something

    // 释放锁
    pthread_mutex_unlock(&mutex);

    // 等待线程结束
    pthread_join(thread, NULL);

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);

    return 0;
}

在示例中,我们使用pthread_mutex_t定义一个互斥锁类型mutex,通过pthread_mutex_lock函数获取锁,通过pthread_mutex_unlock函数释放锁。在主线程中,我们先获取锁,然后执行一些操作,最后释放锁。在子线程中,我们需要先获取锁,才能执行操作。

二、条件变量(Condition Variable)

1. 条件变量概念

条件变量是一种同步机制,用于解决一个线程必须等待另外一个线程完成某项操作后才能继续执行的情况。pthread_cond_t为条件变量类型,可以通过pthread_cond_init、pthread_cond_wait、pthread_cond_signal、pthread_cond_broadcast等函数使用此类型进行相关的操作。

2. 示例

#include <pthread.h>
#include <stdio.h>

pthread_mutex_t mutex;
pthread_cond_t cond;

void* thread_func(void* data)
{
    // 加锁
    pthread_mutex_lock(&mutex);

    // 等待条件变量
    pthread_cond_wait(&cond, &mutex);

    // do something

    // 释放锁
    pthread_mutex_unlock(&mutex);

    return NULL;
}

int main(int argc, char** argv)
{
    pthread_t thread;

    // 初始化互斥锁和条件变量
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    // 创建线程
    pthread_create(&thread, NULL, thread_func, NULL);

    // 加锁
    pthread_mutex_lock(&mutex);

    // do something

    // 通知条件变量
    pthread_cond_signal(&cond);

    // 释放锁
    pthread_mutex_unlock(&mutex);

    // 等待线程结束
    pthread_join(thread, NULL);

    // 销毁互斥锁和条件变量
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

    return 0;
}

在示例中,我们定义一个条件变量cond,通过pthread_cond_wait函数等待条件变量的信号,通过pthread_cond_signal函数发送条件变量信号。

三、信号量(Semaphore)

1. 信号量概念

信号量是一种同步机制,主要用于控制多个线程之间对共享资源的访问。通常用于限制同时访问某些资源的线程数量,控制并发线程的数量。sem_t为信号量类型,可以通过sem_init、sem_wait、sem_post、sem_destroy等函数使用此类型进行相关的操作。

2. 示例

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>

sem_t sem;

void* thread_func(void* data)
{
    // 等待信号量
    sem_wait(&sem);

    // do something

    // 发送信号量
    sem_post(&sem);

    return NULL;
}

int main(int argc, char** argv)
{
    pthread_t thread;

    // 初始化信号量
    sem_init(&sem, 0, 1);

    // 创建线程
    pthread_create(&thread, NULL, thread_func, NULL);

    // 等待信号量
    sem_wait(&sem);

    // do something

    // 发送信号量
    sem_post(&sem);

    // 等待线程结束
    pthread_join(thread, NULL);

    // 销毁信号量
    sem_destroy(&sem);

    return 0;
}

在示例中,我们使用sem_t定义一个信号量sem,通过sem_wait函数等待信号量,通过sem_post函数发送信号量。

四、读写锁(Read-Write Lock)

1. 读写锁概念

读写锁是一种同步机制,与互斥锁类似,不同的是读写锁允许同时有多个读操作,但只能有一个写操作。通常读操作并不会修改数据,而是对数据进行访问和展现,因此可以有多个线程同时进行读操作。pthread_rwlock_t为读写锁类型,可以通过pthread_rwlock_init、pthread_rwlock_rdlock、pthread_rwlock_wrlock、pthread_rwlock_unlock、pthread_rwlock_destroy等函数使用此类型进行相关的操作。

2. 示例

#include <pthread.h>
#include <stdio.h>

pthread_rwlock_t rwlock;

void* read_thread_func(void* data)
{
    // 读取锁
    pthread_rwlock_rdlock(&rwlock);

    // do read

    // 释放读锁
    pthread_rwlock_unlock(&rwlock);

    return NULL;
}

void* write_thread_func(void* data)
{
    // 写锁
    pthread_rwlock_wrlock(&rwlock);

    // do write

    // 释放写锁
    pthread_rwlock_unlock(&rwlock);

    return NULL;
}

int main(int argc, char** argv)
{
    pthread_t read_thread, write_thread;

    // 初始化读写锁
    pthread_rwlock_init(&rwlock, NULL);

    // 创建读线程和写线程
    pthread_create(&read_thread, NULL, read_thread_func, NULL);
    pthread_create(&write_thread, NULL, write_thread_func, NULL);

    // 等待读线程和写线程结束
    pthread_join(read_thread, NULL);
    pthread_join(write_thread, NULL);

    // 销毁读写锁
    pthread_rwlock_destroy(&rwlock);

    return 0;
}

在示例中,我们定义一个读写锁类型rwlock,通过pthread_rwlock_rdlock函数获取读锁,通过pthread_rwlock_wrlock函数获取写锁,通过pthread_rwlock_unlock函数释放锁。在主线程中先创建读线程和写线程,然后等待它们结束,最后销毁读写锁。

五、总结

四种线程同步机制各有特点,应根据具体需求进行选择。如果需要的是最基本的线程同步措施,应选择互斥锁;如果需要等待某个条件,再进行操作,则选择条件变量;如果需要限制并发量,则选择信号量;如果需要多读单写,则选择读写锁。

以上是本文对C++实现线程同步的四种方式的总结。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现线程同步的四种方式总结 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • python thread 并发且顺序运行示例

    当我们在python中使用多线程编程时,为了保证多个线程能够在正确的顺序运行,我们需要进行线程同步操作,避免数据的竞争和混乱。下面我将提供两个示例来展示如何在python中使用线程同步操作实现并发且顺序运行的效果。 1. 通过Lock对象实现线程同步 首先我们需要导入threading模块中的Lock类,这是python内置的线程同步机制之一。在本次示例中,…

    多线程 2023年5月17日
    00
  • C++11学习之多线程的支持详解

    C++11学习之多线程的支持详解 在C++11标准中,多线程支持成为了一个正式的标准库,并引入了一些新的概念和类型,如线程、互斥锁、条件变量等,以及一些用于控制线程行为的函数和类。 下面我们来详细讲解多线程的支持。 线程 在线程头文件<thread>中定义了线程类std::thread,用于创建和控制线程。线程类的构造函数接收一个可调用对象,并执…

    多线程 2023年5月17日
    00
  • Python多线程编程之threading模块详解

    Python多线程编程之threading模块详解 什么是多线程编程 多线程编程是指在一个程序进程中同时运行多个不同的线程,这些线程可能会共享程序的内存空间和其他资源。在多线程编程中,有时需要将某一些任务放在不同的线程中运行,从而带来以下好处: 使程序可以同时执行多个任务,提高程序效率; 能够更加充分地利用计算机的CPU和其他资源; 在某些情况下,使用多线程…

    多线程 2023年5月16日
    00
  • 深入分析JAVA 多线程–interrupt()和线程终止方式

    深入分析JAVA 多线程 – interrupt()和线程终止方式 前言 在多线程程序中,线程的终止是一个重要的主题。Java提供了多个API来让我们实现线程的终止。其中interrupt()方法是一个比较常用也比较容易被理解的API,同时也是本篇攻略的重点内容。 interrupt() 方法 在Java中,每个线程都有一个布尔类型(Boolean)的中断标…

    多线程 2023年5月17日
    00
  • Java中内核线程理论及实例详解

    Java中内核线程理论及实例详解 什么是内核线程 内核线程是由操作系统内核创建和管理的线程。它们直接受操作系统调度,有高优先级的执行能力,并且可以访问操作系统内核的资源。Java中的内核线程主要由操作系统和JVM负责管理,通常与Java虚拟机的线程不同。比如在Linux系统中的内核线程可以通过ps命令查看。 Java中的内核线程 Java中的内核线程通常由操…

    多线程 2023年5月17日
    00
  • Java countDownLatch如何实现多线程任务阻塞等待

    Java中的CountDownLatch是一个同步工具类,它的主要作用是让一个或多个线程阻塞等待其它线程完成某些操作后再继续执行,可以很好地实现多线程任务的协调。 CountDownLatch的实现方式是通过一个计数器来实现的,初始化时需要传入一个计数器的值,每当一个线程完成相关操作后,计数器的值就会减1,直到计数器的值为0时,所有因调用await()方法而…

    多线程 2023年5月16日
    00
  • Java 中 synchronized的用法详解(四种用法)

    下面是”Java 中 synchronized的用法详解(四种用法)”的完整攻略。 一、synchronized的四个作用 Java中的synchronized关键字可以用于四个方面: 实例方法 静态方法 代码块 class对象锁 二、同步实例方法 用来同步这个实例的所有方法,只允许有一个线程同时访问这个实例的这些方法。需要加在方法前面。 代码示例: pub…

    多线程 2023年5月17日
    00
  • C#并发编程入门教程之概述

    针对“C#并发编程入门教程之概述”,我的攻略如下: C#并发编程入门教程之概述 简介 C#并发编程是一种在多个线程中共享数据、协调和同步操作的编程方式。在多任务系统和多核处理器上,使用并发编程可以提高系统使用率和性能。 本教程旨在介绍C#并发编程的基础知识、相关概念和常用技术,包括线程、锁、并发集合等等。 基础知识 线程 线程是操作系统进行任务调度的最小单位…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部