线程同步 互斥量(mutex) Linux函数
线程同步:线程的同步需要用到互斥量(mutex)用pthread_mutex_t类型表示。互斥量(mutex)是一种简单的加锁的方法来控制对关心资源的访问。在同一时间只有一个线程掌握某个互斥上的锁,拥有锁的线程可以对共享资源进行访问。如其它线程希望上锁一个已经被上了的互斥锁的资源。则该线程被挂起,知道拥有这把锁的线程释放锁为止。用到的函数 #include in
线程同步:
线程的同步需要用到互斥量(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;
}
运行结果:
更多推荐
所有评论(0)