• 互斥锁与条件变量的使用(c || c++ || python)


    python

    import threading
    
    # 创建Event对象
    event = threading.Event()
    
    # 线程函数
    def thread_function():
        print("Thread is waiting for event to be set")
        event.wait()
        print("Event is set. Thread is continuing")
    
    # 创建线程
    thread = threading.Thread(target=thread_function)
    
    # 启动线程
    thread.start()
    
    # 触发事件
    event.set()
    
    # 等待线程结束
    thread.join()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    set()是用于创建一个空集合的语法。集合是一种无序且不重复的数据结构
    wait()是threading.Event()对象的一个方法,用于使线程等待事件的发生


    1.创建了一个Event对象event
    2.定义了一个线程函数thread_function(),该函数首先打印一条消息,然后调用event.wait()来等待事件的触发
    3.创建了一个线程,并启动该线程
    4.调用event.set()来触发事件
    5.使用thread.join()等待线程结束


    c

    #include 
    #include 
    
    // 共享资源
    int shared_resource = 0;
    
    // 互斥锁和条件变量
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    
    // 线程函数
    void* thread_function(void* arg) {
        // 获取互斥锁
        pthread_mutex_lock(&mutex);
        
        // 等待条件变量
        while (shared_resource == 0) {
            pthread_cond_wait(&cond, &mutex);
        }
        
        // 条件满足,访问共享资源
        printf("Thread is accessing shared resource: %d\n", shared_resource);
        
        // 释放互斥锁
        pthread_mutex_unlock(&mutex);
        
        return NULL;
    }
    
    int main() {
        // 初始化互斥锁和条件变量
        pthread_mutex_init(&mutex, NULL);
        pthread_cond_init(&cond, NULL);
        
        // 创建线程
        pthread_t thread;
        pthread_create(&thread, NULL, thread_function, NULL);
        
        // 修改共享资源
        pthread_mutex_lock(&mutex);
        shared_resource = 42;
        // 发送信号通知条件已满足
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);
        
        // 等待线程结束
        pthread_join(thread, NULL);
        
        // 销毁互斥锁和条件变量
        pthread_mutex_destroy(&mutex);
        pthread_cond_destroy(&cond);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    在C语言中,可以使用互斥锁(Mutex)和条件变量(Condition Variable)来实现线程同步。

    互斥锁用于保护共享资源,确保在任何时候只有一个线程可以访问共享资源。当一个线程获得互斥锁时,其他线程将被阻塞,直到该线程释放互斥锁。

    条件变量用于线程间的通信和同步。它允许一个线程等待某个条件成立,而其他线程可以通过发送信号来通知该条件已经满足。


    1.使用pthread_mutex_t定义了互斥锁mutex,并使用pthread_cond_t定义了条件变量cond
    2.在线程函数中使用pthread_mutex_lock()获取互斥锁,并使用pthread_cond_wait()等待条件变量
    3.在主线程中,修改共享资源,并使用pthread_cond_signal()发送信号通知条件已满足
    4.使用pthread_join()等待线程结束,并使用pthread_mutex_destroy()和pthread_cond_destroy()销毁互斥锁和条件变量


    c++

    在C++中,可以使用std::mutex和std::condition_variable来实现线程同步。这些类提供了与C语言中的互斥锁和条件变量类似的功能

    #include 
    #include 
    #include 
    #include 
    
    // 共享资源
    int shared_resource = 0;
    
    // 互斥锁和条件变量
    std::mutex mutex;
    std::condition_variable cond;
    
    // 线程函数
    void thread_function() {
        // 获取互斥锁
        std::unique_lock lock(mutex);
        
        // 等待条件变量
        cond.wait(lock, [](){ return shared_resource != 0; });
        
        // 条件满足,访问共享资源
        std::cout << "Thread is accessing shared resource: " << shared_resource << std::endl;
    }
    
    int main() {
        // 创建线程
        std::thread thread(thread_function);
        
        // 修改共享资源
        {
            std::lock_guard lock(mutex);
            shared_resource = 42;
        }
        // 发送信号通知条件已满足
        cond.notify_one();
        
        // 等待线程结束
        thread.join();
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    1.使用std::mutex定义了互斥锁mutex,并使用std::condition_variable定义了条件变量cond
    2.在线程函数中使用std::unique_lock获取互斥锁,并使用cond.wait()等待条件变量
    3.在主线程中,我们修改了共享资源,并使用cond.notify_one()发送信号通知条件已满足
    4.使用thread.join()等待线程结束

    总结起来,C语言和C++中的互斥锁和条件变量提供了一种线程同步的机制,以保护共享资源并实现线程间的通信。在Python中,可以使用threading.Lock()和threading.Event()来实现类似的功能

    扩展

    // 接受一个参数的lambda表达式
    int x = 42;
    auto lambda1 = [](int y) { return y + 1; };
    int result1 = lambda1(x);  // result1 = 43
    
    // 返回值为bool类型的lambda表达式
    auto lambda2 = []() -> bool { return true; };
    bool result2 = lambda2();  // result2 = true
    
    // 返回值为void类型的lambda表达式
    auto lambda3 = []() { std::cout << "Hello, World!" << std::endl; };
    lambda3();  // 输出:Hello, World!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在C++中,<>是模板参数列表的标识符,用于指定模板的参数类型。
    在std::unique_lockstd::mutex lock(mutex);这行代码中,std::unique_lock是一个模板类,它接受一个模板参数std::mutex,表示使用std::mutex作为互斥锁的类型。因此,std::unique_lockstd::mutex实际上是一个互斥锁的封装。

    而在cond.wait(lock, { return shared_resource != 0; });这行代码中,{ return shared_resource != 0; }是一个lambda表达式。
    lambda表达式是一种匿名函数,可以在代码中直接定义和使用,而不需要单独定义一个函数。它的语法是[] (参数列表) { 函数体 }。

    在这个特定的例子中,lambda表达式被用作std::condition_variable的wait()函数的第二个参数。lambda表达式的函数体return shared_resource != 0;返回一个布尔值,表示条件是否满足。cond.wait()函数会在等待条件变量时检查这个lambda表达式的返回值,只有当返回值为true时,才会继续执行

    lambda表达式是C++11引入的一项功能强大的特性,可以方便地定义匿名函数。它在很多情况下可以简化代码,并提高代码的可读性和可维护性

  • 相关阅读:
    h5和微信小程序实现拍照功能(其中h5暂时无法调用闪光灯)
    Windows 安装 RabbitMq
    fastadmin找不到后台控制器。登录之后找不到后台控制器
    Mysql基于docker搭建主从备份
    【Python】你真的了解异常吗?-别再说你不了解异常啦
    Linux ALSA驱动之Platform源码分析(wm8350.c)
    REDIS04_主从复制概述及搭建、反客为主、薪火相传、原理、哨兵模式、集群搭建
    Python多进程
    21天挑战赛算法学习打卡——顺序查找
    JUC第七讲:关键字final详解
  • 原文地址:https://blog.csdn.net/hold_the_key/article/details/133385060