在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;
}
运行结果: