linux线程同步的互斥锁(mutex)到底怎么用的》?谢谢

linux线程同步的互斥锁(mutex)到底怎么用的》?谢谢,第1张

互斥锁(mutex) 通过锁机制实现线程间的同步。

1、初始化锁。在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。

2、静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER

3、动态分配:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr)

4、加锁。对共享资源的访问,要对互斥量进行加锁,如果互斥量已经上了锁,调用线程会阻塞,直到互斥量被解锁

    int pthread_mutex_lock(pthread_mutex *mutex)

    int pthread_mutex_trylock(pthread_mutex_t *mutex)

    解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。

    int pthread_mutex_unlock(pthread_mutex_t *mutex)

    销毁锁。锁在是使用完成后,需要进行销毁以释放资源。

    int pthread_mutex_destroy(pthread_mutex *mutex)

    #include <cstdio>  

    #include <cstdlib>  

    #include <unistd.h>  

    #include <pthread.h>  

    #include "iostream"  

    using namespace std  

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER  

    int tmp  

    void* thread(void *arg)  

    {  

        cout << "thread id is " << pthread_self() << endl  

        pthread_mutex_lock(&mutex)  

        tmp = 12  

        cout << "Now a is " << tmp << endl  

        pthread_mutex_unlock(&mutex)  

        return NULL  

    }  

    int main()  

    {  

        pthread_t id  

        cout << "main thread id is " << pthread_self() << endl  

        tmp = 3  

        cout << "In main func tmp = " << tmp << endl  

        if (!pthread_create(&id, NULL, thread, NULL))  

        {  

            cout << "Create thread success!" << endl  

        }  

        else  

        {  

            cout << "Create thread failed!" << endl  

        }  

        pthread_join(id, NULL)  

        pthread_mutex_destroy(&mutex)  

        return 0  

    }  

    //编译:g++ -o thread testthread.cpp -lpthread

不同线程要按照相同顺序进行加解锁。

设置互斥量属性为PTHREAD_MUTEX_ERRORCHECK(如果一个线程试图对一个互斥锁重复锁定,将会返回一个错误代码,从根本上避免死锁)

设置互斥量属性为PTHREAD_MUTEX_RECURSIVE(允许对一个互斥量多次加锁,如:加锁3次,也要解锁3次才能真正释放该锁)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7628721.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-07
下一篇2023-04-07

发表评论

登录后才能评论

评论列表(0条)

    保存