操作系统(Linux)多线程--互斥量实现同步

Linux多线程--信号量实现同步中用信号量实现了多线程同步。


在信号量中用sem_t结构表示,在互斥量中用pthread_mutexattr_t表示。

使用互斥变量以前,必须首先对它进行初始化,可以把它设置为常量PTHREAD_MUTEX_INITIALIZER(只适合用于静态分配的互斥量),

也可以用pthread_mutexattr_init函数初始化pthread_mutexatrr_t结构。如果用动态分配(如调用malloc函数),在释放内存前

pthread_mutexattr_destroy函数丢弃用完的互斥量。



#include <pthread.h>
int pthread_mutexttr_init(pthread_mutexattr_t *attr);
int pthread_mutexattr_destory(pthread_mutexattr_t *attr);

要默认的属性初始化互斥量,只需要把attr设置为NULL。


#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)

对互斥量进行加锁,需要调用pthread_mutex_lock。如果互斥量已经上锁,调用线程将阻塞直到互斥量被解锁。

对于互斥量解锁,需要调用pthread_mutex_unlock。

如果线程不希望被阻塞,它可以调用pthred_mutex_trylock尝试对互斥量进行加锁。如果调用pthread_mutex_trylock时互斥量处于未锁住状态,那么pthread_mutex_trylock

将被锁住互斥量,不会出现直到返回0,否则pthread_mutex_trylock就会失败,不能锁住互斥量,返回EBUY。


一个小例子:

#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>


pthread_mutex_t mutex;
int i=0;

void* thread_fun1()
{

   while(i<10)
   {
    pthread_mutex_lock(&mutex);
    i+=1;
    printf("i 1: %d\n",i);
    pthread_mutex_unlock(&mutex);
    sleep(2);
  }
}

void* thread_fun2()
{
   while(i<10)
   {
    pthread_mutex_lock(&mutex);
    i=i+2;
    printf("i 2: %d\n",i);
    pthread_mutex_unlock(&mutex);
    sleep(2);
    }
}

int main()
{
     pthread_t t1,t2;
     pthread_mutex_init(&mutex,NULL);
     pthread_create(&t1,NULL,thread_fun1,NULL);
     pthread_create(&t2,NULL,thread_fun2,NULL);

     pthread_join(t1,NULL);
     pthread_join(t2,NULL);

     printf("\n");
     return 0;
}




运行结果:



猜你喜欢

转载自blog.csdn.net/qq_23948283/article/details/53400135