小结一
上一节讲了基本使用方法,接下来讲线程之间的通信及注意事项
对一些公共资源的访问同一时刻具有唯一性,因此我们需要引入同步和互斥机制。
首先讲互斥锁
pthread_mutex_init() 互斥锁初始化
pthread_mutex_lock() 互斥锁上锁
pthread_mutex_trylock() 互斥锁判断上锁
pthread_mutex_unlock() 互斥锁解锁
pthread_mutex_destroy() 消除互斥锁
废话不多说 直接示例
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
int global_lock_var;
timer_t end_time;
void test1()
{
while(time(NULL)<end_time)
{
if(pthread_lock(&mutex)!=0)
{
printf("id1 lock fail\r\n");
}
global_lock_var++;
sleep(1);
if(pthread_unlock(&mutex)!=0)
printf("id1 unlock fail\r\n");
}
}
void test2()
{
while(time(NULL)<end_time)
{
bit=pthread_mutex_trylock(&mutex);
if(bit==EBUSY)
{
printf("id2 trylock busyr\n");
}
else
{
if(bit!=0)
{
printf("id2 lock fail\r\n");
}
else
{
global_lock_var--;
sleep(1);
}
}
}
}
int main(int argc,char argv[])
{
pthread_t id1,id2;
int bit;
end_time = time(NULL) + 5;
pthread_mutex_init(&mutex,NULL);
bit=pthread_create(&id1,NULL,test1,NULL);
if(bit!=0)
{
printf("id1 create fail\r\n");
exit(0);
}
bit=pthread_create(&id2,NULL,test2,NULL);
if(bit!=0)
{
printf("id2 create fail\r\n");
exit(0);
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 0;
}
接下来数信号量pv操作,其实也是互斥量的一种。
int sem_init(sem_t *sem, int pshared, unsigned int value);//信号量的初始化
sem_wait() // 相当于p操作,线程将要阻塞。
sem_trywait() //相当于p操作,不过线程不会阻塞
sem_post() //相当于v操作 ,将信号值加一
sem_getvalue() //获取信号量
sem_destroy // 删除信号量
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>
sem_t sem;
int global_local;
time_t time_end;
void *test1()
{
int i=0;
while(time(NULL)<time_end)
{
sem_wait(&sem);
gloabal_local++;
printf("id1 is %d",global_local);
sleep(1);
sem_post(&sem);
}
}
void *test2()
{
int i;
while(time(NULL)<time_end)
{
sem_wait(&sem);
gloabal_local++;
printf("id1 is %d",global_local);
sleep(1);
sem_post(&sem);
}
}
int main(int argc,char char argv[])
{
pthread_t id1,id2;
int bit;
srm_init(&sem,0,1);
time_end=time(NULL)+5;
bit=pthread_create(&id1,NULL,test1,NULL);
if(bit!=0)
{
printf("id1 create fail\r\n");
}
bit=pthread_create(&id2,NULL,test2,NULL);
if(bit!=0)
{
printf("id2 craete fail\r\n");
}
pthread_join(&id1,NULL);
pthread_join(&id2,NULL);
return 0;
}