线程间通讯(几种常见的通讯机制,以及实例)

线程间通讯是指多个线程之间通过某种机制进行信息交流和共享数据的过程。线程间通讯的目的是为了协调不同线程的工作,使得它们能够有序地执行任务,避免出现竞争条件和数据不一致的问题。

一、常见的线程间通讯机制方式

1、 共享内存

        多个线程共享同一块内存区域,通过读写共享内存来实现信息交流和数据共享。需要考虑线程安全问题,可以使用互斥锁、信号量等机制来保证数据的一致性。

2、信号量

        通过信号量来实现线程之间的同步和互斥。通过P操作和V操作来改变信号量的值,当信号量的值为0时,线程需要等待;当信号量的值大于0时,线程可以继续执行。

3、互斥锁

        通过互斥锁来实现线程之间的互斥访问共享资源。当一个线程获取到互斥锁时,其他线程需要等待;当一个线程释放互斥锁时,其他线程可以竞争获取锁。

4、条件变量

        通过条件变量来实现线程之间的等待和唤醒。当线程需要等待某个条件满足时,可以调用条件变量的等待函数使自己进入等待状态;当条件满足时,可以调用条件变量的唤醒函数唤醒等待的线程。

5、管道

        通过管道来实现线程之间的通信。一个线程可以将数据写入管道,另一个线程可以从管道中读取数据。需要注意管道的大小限制和线程安全问题。

6、postThreadMessage(MFC)

      PostThreadMessage是一个Windows API函数,用于向指定线程的消息队列中发送一个消息.。

以上是常见的几种线程间通讯机制,不同的场景和需求可能需要选择不同的机制来实现线程间的通讯。

二、进程间通讯的实例

1、互斥锁(mutex)和条件变量(condition_variable)

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
bool ready = false;
int val = 0;

void producer()
{
    // 模拟生产者生产数据的耗时操作:让当前线程暂停执行 2 秒钟
    std::this_thread::sleep_for(std::chrono::seconds(2)); 
    std::lock_guard<std::mutex> lock(mtx);// 在作用域中加锁
    val = 42;
    ready = true;
    cv.notify_one(); // 唤醒等待的线程
}// 在作用域结束时自动解锁

void consumer()
{
    std::cout << "Consumer is waiting for data..." << std::endl;

    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, []{ return ready; });// 在满足特定条件之前暂时挂起自己

    std::cout << "Consumer received data: " << val << std::endl;
}

int main()
{
    std::thread t1(producer);
    std::thread t2(consumer);

    t1.join();
    t2.join();

    return 0;
}

std::lock_guard 是C++标准库中的一个模板类,用于保护一个互斥量(mutex)的自动加锁和解锁操作。它是RAII(资源获取即初始化)的一种实现方式。

当创建一个 std::lock_guard 对象时,它会在构造函数中自动调用互斥量的 lock() 方法,获取互斥量的锁。当 std::lock_guard 对象被销毁时,它会在析构函数中自动调用互斥量的 unlock() 方法,释放互斥量的锁。

使用 std::lock_guard 可以确保在作用域结束时互斥量一定会被解锁,避免了因为异常或其他原因导致忘记解锁而造成的死锁问题。

扫描二维码关注公众号,回复: 15902752 查看本文章

std::condition_variable是C++标准库中定义的一个类,用于多线程编程中的线程同步和互斥操作。它提供了一种线程间的通信机制,允许一个线程等待另一个线程满足特定条件后再继续执行。

具体来说,std::condition_variable可以与std::mutex(互斥锁)配合使用,实现线程的等待和唤醒操作。一个线程可以通过调用std::condition_variable的wait()函数,在满足特定条件之前暂时挂起自己。另一个线程在某个条件满足时,可以通过调用std::condition_variable的notify_one()或notify_all()函数,唤醒等待的线程。

std::condition_variable的使用通常需要和std::unique_lockstd::mutex结合使用,以实现线程安全的条件变量操作。在等待条件时,线程会自动释放持有的互斥锁,使得其他线程可以访问共享资源。当条件满足时,线程会重新获取互斥锁,并继续执行。

总而言之,std::condition_variable提供了一种线程间的协调机制,使得线程可以在特定条件满足时等待或唤醒,从而实现更灵活的线程同步和互斥操作。

在这个示例中,有一个生产者线程和一个消费者线程。生产者线程会在2秒后生成一个数据,并将ready标志设置为true,然后通知消费者线程。消费者线程在收到通知后,输出接收到的数据。

通过互斥锁(mutex)和条件变量(condition_variable),生产者线程在生产数据之前会等待消费者线程准备好。消费者线程在接收到数据之前会等待生产者线程通知。

这样就实现了线程间的通信。

2、postThreadMessage(MFC)

实例可以参考上一篇文章:线程间通讯:PostThreadMessage_Ivy_belief的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/bigger_belief/article/details/131786834