Linux-线程互斥-锁

互斥锁

    当一个共享资源的操作不是原子的,在多线程同时访问共享资源时可能会出现达不到预期的效果错误,为了解决共享资源操作竞争的问题,引入了互斥锁。

     1、访问共享资源前,必须申请该互斥锁,若处于开锁状态,则申请到锁对象,并立即占有该锁,以防止其他线程访问该资源;如果该互斥锁处于锁定状态,则阻塞当前线程。

     2、只有锁定该互斥锁的进程才能释放该互斥锁,其他线程试图释放无效。

    init
        pthread_mutex_t mutex_lock;
        pthread_mutex_init(&mutex_lock,NULL);
    lock
        pthread_mutex_lock(&mutex_lock);  以阻塞方式申请互斥锁;
        pthread_mutex_trylock(&mutex_lock)以非阻塞方式申请互斥锁;
    unlock
        pthread_mutex_unlock(&mutex_lock);

实例

    2个线程分别对全局变量count加加5000次,但由于操作count语句不是原子操作,会导致在最后给count内存赋值过程中被其他线程读取导致出错,这里要想不出错,2个办法:

    1、语句改为:count++;

    2、加互斥锁保护count资源;

#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include <sys/types.h>
#include <unistd.h>

int count = 0;
pthread_mutex_t mutex_lock;

void* pthread_run()
{
    int i = 0;
    int ret = 0;
    while(i < 5000)
    {
        pthread_mutex_lock(&mutex_lock);
        i++;
        ret = count;
        printf("process ID:%d,pthread ID:%lu,count:%d\n",getpid(),pthread_self(),count);
        count = ret + 1;
        pthread_mutex_unlock(&mutex_lock);
    }
    pthread_exit(NULL);
}
 
int main()
{
    pthread_t id1;
    pthread_t id2;

    pthread_mutex_init(&mutex_lock,NULL);
    pthread_create(&id1,NULL,&pthread_run,NULL);
    pthread_create(&id2,NULL,&pthread_run,NULL);
    pthread_join(id1,NULL);  
    pthread_join(id2,NULL);
    printf("count: %d\n",count);
    return 0;
}

内核线程锁

猜你喜欢

转载自blog.csdn.net/TSZ0000/article/details/83016247