linux多线程编程小结(二)

小结一
上一节讲了基本使用方法,接下来讲线程之间的通信及注意事项
对一些公共资源的访问同一时刻具有唯一性,因此我们需要引入同步和互斥机制。
首先讲互斥锁

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;
}

小结三

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值