线程同步 互斥量(mutex) Linux函数

来源:互联网 发布:win8.1网络连接不可用 编辑:程序博客网 时间:2024/04/30 06:21

线程同步:

线程的同步需要用到互斥量(mutex)用pthread_mutex_t类型表示。

互斥量(mutex)是一种简单的加锁的方法来控制对关心资源的访问。在同一时间只有一个线程掌握某个互斥上的锁,拥有锁的线程可以对共享资源进行访问。如其它线程希望上锁一个已经被上了的互斥锁的资源。则该线程被挂起,知道拥有这把锁的线程释放锁为止。

用到的函数

  #include <pthread.h>

       int pthread_mutex_init(pthread_mutex_t*restrict mutex,

              const pthread_mutexattr_t*restrict attr);

       pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//和调用pthread_mutex_init()函数初始化锁是一样的。

功能:初始化锁

返回值:成功返回0

参数:

mutex:线程锁变量的地址

attr:线程锁变量的属性,要用默认的属性初始化锁就可以把它设为NULL

#include<pthread.h>

intpthread_mutex_destroy(pthread_mutex_t *mutex);

功能:销毁线程锁

返回值:成功返回0

参数:线程锁的地址

 

#include<pthread.h>

Int thread_mutex_lock(pthread_mutex_t*mutex);

功能:上锁(访问资源),如果互斥量已经上锁则线程将阻塞上互斥量解锁

返回值:成功返回0

#include<pthread.h>

Int thread_mutex_unlock(pthread_mutex_t*mutex);

功能:释放锁(释放资源)

返回值:成功返回0

参数:线程锁的地址

 

#include<pthread.h>

Int thread_mutex_trylock(pthread_mutex_t *mutex);

功能:如果线程不希望阻塞,它就可以用此函数尝试对互斥量加锁,如果互斥量未处于加锁状态,那么Int thread_mutex_trylock(pthread_mutex_t*mutex);将锁住互斥量,不会出现阻塞并返回0.,否则就会失败,不能锁住互斥量。

返回值:成功返回0

参数:线程锁的地址

 

例子:

#include<stdio.h>

#include<stdlib.h>

#include<fcntl.h>

#include<sys/stat.h>

#include<sys/types.h>

#include<pthread.h>

#define FILENAME  "testfile"

 

int fd;

//pthread_mutex_tmutex_lock1,mutex_lock2

 

pthread_mutex_t mutex_lock1 = PTHREAD_MUTEX_INITIALIZER;

pthread_mutex_t mutex_lock2 = PTHREAD_MUTEX_INITIALIZER;

 

void *pthfun(void *arg)

{

      int i=0;

      while(i++<5)

      {

           pthread_mutex_lock(&mutex_lock1);

           write(fd,"1",sizeof(char));

           pthread_mutex_unlock(&mutex_lock2);

      }

       pthread_exit(((void *) 0));

//    return   ((void *) 10);

}

 

int main()

{

      int i=0;

      void * ret;

//pthread_mutex_init函数初始化锁。

//pthread_mutex_init(&mutex_lock1,NULL);

       //pthread_mutex_init(&mutex_lock2,NULL);

 

      pthread_ttid;

      fd=open(FILENAME,O_RDWR|O_CREAT| O_APPEND | O_TRUNC,0666);

       //O_TRUNC 将文件的长度截为0,(清空文件) 

      // O_APPEND 追加到文件尾   pthread_create(&tid,NULL,pthfun,NULL);

 

           while(i++<5)

      {

           pthread_mutex_lock(&mutex_lock2);

           write(fd,"1",sizeof(char));

           pthread_mutex_unlock(&mutex_lock1);

      }

   

      pthread_join(tid,&ret);

       printf("ret=%d\n", (int)ret);

       close(fd);

        pthread_mutex_destroy(&mutex_lock1);

       pthread_mutex_destroy(&mutex_lock2);

      return 0;

}

运行结果为:

 

看一个例子:

#include<stdio.h>

#include<stdlib.h>

#include<pthread.h>

 

pthread_mutex_t mutex_lock1 ,mutex_lock2;

 

int value=0;

void *pthfun(void *arg)

{

      int i=0;

      while(i++<5)

      {

           pthread_mutex_lock(&mutex_lock1);

           value+=1;

           printf("value+=1\n");

           pthread_mutex_unlock(&mutex_lock2);

      }

      pthread_exit(((void*) 10));

}

 

 

int main()

{

      int i=0;

      void * ret;

      pthread_mutex_init(&mutex_lock1,NULL);

      pthread_mutex_init(&mutex_lock2,NULL);

      pthread_t tid;

      pthread_create(&tid,NULL,pthfun,NULL);

 

      while(i++<5)

      {

           pthread_mutex_lock(&mutex_lock2);

           value+=2;

           printf("value+=2\n");

           pthread_mutex_unlock(&mutex_lock1);

      }

      pthread_join(tid,&ret);  

 

      printf("ret=%d\n",(int)ret);

      pthread_mutex_destroy(&mutex_lock1);

      pthread_mutex_destroy(&mutex_lock2);

      return 0;

}

 

运行结果: