【Linux开发】linux线程同步方式互斥锁介绍及实例

来源:互联网 发布:淘宝标题如何自动生成 编辑:程序博客网 时间:2024/05/21 17:55
线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步,最常用的是互斥、读写锁、条件变量和信号量。

1、互斥锁(mutex

    通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);

int pthread_mutex_lock(pthread_mutex *mutex);

int pthread_mutex_destroy(pthread_mutex *mutex);

int pthread_mutex_unlock(pthread_mutex *

(1)先初始化锁init()或静态赋值pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER

attr_t有:

PTHREAD_MUTEX_TIMED_NP:其余线程等待队列

PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁,允许线程多次加锁,不同线程,解锁后重新竞争

PTHREAD_MUTEX_ERRORCHECK_NP:检错,与一同,线程请求已用锁,返回EDEADLK;

PTHREAD_MUTEX_ADAPTIVE_NP:适应锁,解锁后重新竞争

(2)加锁,lock,trylock,lock阻塞等待锁,trylock立即返回EBUSY

(3)解锁,unlock需满足是加锁状态,且由加锁线程解锁

(4)清除锁,destroy(此时锁必需unlock,否则返回EBUSY,//Linux下互斥锁不占用内存资源

2、实例及运行结果

    #include <stdio.h>

    #include <stdlib.h>

    #include <unistd.h>

    #include <pthread.h>
       

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

    int tmp;

       

    void* thread1(void *arg)

    {

        printf("thread id is %d\n",pthread_self());
        pthread_mutex_lock(&mutex);

        tmp = 1;

        printf("Now a is %d\n",tmp);

        pthread_mutex_unlock(&mutex);

        return NULL;

    }
    void* thread2(void *arg)

    {

        printf("thread id is %d\n",pthread_self());
        pthread_mutex_lock(&mutex);

        tmp = 2;

        printf("Now a is %d\n",tmp);

        pthread_mutex_unlock(&mutex);

        return NULL;

    }

       

    int main()

    {

        pthread_t id1;
        pthread_t id2;

        printf("main thread id is %d\n", pthread_self() );

        tmp = 3;

        printf("In main func tmp = %d\n", tmp);;

        if (!pthread_create(&id1, NULL, thread1, NULL))

        {

            printf( "Create thread success!\n");

        }
        if (!pthread_create(&id2, NULL, thread2, NULL))

        {

            printf( "Create thread success!\n");

        }


        sleep(1);
        pthread_join(id1, NULL);
        pthread_join(id2, NULL);

        pthread_mutex_destroy(&mutex);

        return 0;

    }


gcc -o mutex mutex.c -lpthread;./mutex

执行结果如下:

main thread id is -1568364736
In main func tmp = 3
Create thread success!
thread id is -1568368896
Now a is 1
Create thread success!
thread id is -1576761600
Now a is 2

0 0
原创粉丝点击