线程互斥锁

Posted 嵌入式图像处理

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程互斥锁相关的知识,希望对你有一定的参考价值。


互斥之互斥锁

posix互斥锁

互斥锁是用一种简单的加锁方法来控制对共享资源的原子操作。这个互斥锁只有两种状态,也就是上锁和解锁,
可以把互斥锁看作某种意义上的全局变量。在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行操作。
若其他线程希望上锁一个已经被上锁的互斥锁,则该线程就会阻塞挂起,直到上锁的线程释放掉互斥锁为止。
任务访问临界资源前申请锁,访问完后释放锁
头文件
#include  <pthread.h>

互斥锁初始化

int pthread_mutex_init(pthread_mutex_t *mutex,

                       const pthread_mutexattr_t *  attr);
返回0,失败返回错误码


mutex 指向要初始化的互斥锁对象
attr  互斥锁属性,NULL表示缺省属性

申请锁


int pthread_mutex_lock(pthread_mutex_t *mutex);
返回0,失败时返回错误码


mutex  指向要初始化的互斥锁对象
如果无法获得锁,任务阻塞

释放锁


int pthread_mutex_unlock(pthread_mutex_t *mutex);
返回0,失败返回错误码


mutex  指向要初始化的互斥锁对象
执行完临界区要及时释放锁

销毁锁


int pthread_mutex_destroy(pthread_mutex_t *mutex);
返回0,失败返回错误码 

#include <stdio.h>
#include <unistd.h>

#include <pthread.h>

#define N 64
typedef struct message{
    char buf[N];
    int len;
}msg_t;

pthread_mutex_t mymutex;

voidreverse_msgbuf(void* arg)
{
    msg_t *msg = (msg_t *)arg;
    int i = 0;
    char tmp;
    while(1)
    {
        pthread_mutex_lock(&mymutex);
        for(i = 0; i < msg->len/2; i ++)
        {
            tmp          = msg->buf[i];
            msg->buf[i]  = msg->buf[msg->len - i - 1];
            msg->buf[msg->len - i -1] = tmp;
        }
        pthread_mutex_unlock(&mymutex);
    }
}

voidprintf_msgbuf(void* arg)
{
    msg_t *msg = (msg_t *)arg;
    while(1)
    {
        pthread_mutex_lock(&mymutex);
        printf("buf :%s\n",msg->buf);
        pthread_mutex_unlock(&mymutex);
        sleep(1);
    }
}

int main(int argc, const char *argv[])
{
    msg_t msg = {"123456789",9};

    pthread_t tid[2];
    pthread_mutex_init(&mymutex,NULL);

    pthread_create(&tid[0],NULL,reverse_msgbuf,(void *)&msg);
    pthread_create(&tid[1],NULL,printf_msgbuf,(void *)&msg);

    pause();

    return 0;
}


以上是关于线程互斥锁的主要内容,如果未能解决你的问题,请参考以下文章

ReentrantReadWriteLock场景应用

java中ReentrantReadWriteLock读写锁的使用

并发技术12线程锁技术的使用

java并发线程锁技术的使用

Linux:详解多线程(线程安全互斥和死锁)

多线程安全----同步锁(互斥锁)