Linux下多线程编程简介(五)

简介:
  我们已经用信号量来实现线程间的互斥,达到了互斥锁的效果,今天这篇文章将讲述怎样用信号量去实现同步。
         信号量的互斥同步都是通过PV原语来操作的,我们可以通过注册两个信号量,让它们在互斥的问题上互动,从而达到同步。通过下面实例就可以很容易理解:
 
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <semaphore.h>
 
#define return_if_fail(p) \
          if(!p) { printf("[%s]:func error!", __func__); return; }
 
typedef struct _PrivInfo {
          sem_t sem1;
          sem_t sem2;
          int lock_var;
          time_t end_time;
}PrivInfo;
 
void  info_init(PrivInfo *thiz);
void  info_destroy(PrivInfo *thiz);
void *pthread_function1(void *paramthiz);
void *pthread_function2(void *paramthiz);

int main (int argc, char** argv) {
          pthread_t pt_1 = 0;
          pthread_t pt_2 = 0;
          int ret = 0;
          PrivInfo *thiz = NULL;
          thiz = (PrivInfo*)malloc(sizeof(PrivInfo));
          if(NULL == thiz) {
                    return -1;
          }
          info_init(thiz);
          ret = pthread_create(&pt_1, NULL, pthread_function1, (void*)thiz);
          if(0 != ret) {
                    perror("pthread1 creation failed!"); 
          }
 
          ret = pthread_create(&pt_2, NULL, pthread_function2,(void*)thiz);
          if(0 != ret) {
                    perror("pthread2 creation failed!"); 
          }
          pthread_join(pt_1, NULL);
          pthread_join(pt_2, NULL);
          info_destroy(thiz);
 
          free(thiz); 
          thiz = NULL;
 
          return 0;
}
 
void info_init(PrivInfo *thiz) {
          return_if_fail(&thiz != NULL);
          thiz->lock_var = 0;
          thiz->end_time = time(NULL) + 10;
          sem_init(&thiz->sem1, 0, 0);
          sem_init(&thiz->sem2, 0, 1);
 
          return;
}
 
void info_destroy(PrivInfo *thiz) {
          return_if_fail(&thiz != NULL);
          sem_destroy(&thiz->sem1);
          sem_destroy(&thiz->sem2);
 
          return;
}
 
void *pthread_function1(void *paramthiz) { 
          int i = 0;
          PrivInfo *thiz = (PrivInfo *)paramthiz;
          while(time(NULL) < thiz->end_time) {
                    sem_wait(&thiz->sem2);
                    printf("thread1 get the lock.\n");
  
                    sem_post(&thiz->sem1);
                    printf("thread1 unlock.\n");
                    sleep(1);
          }
          pthread_exit(NULL);
}
 
void *pthread_function2(void *paramthiz) { 
          PrivInfo *thiz = (PrivInfo *)paramthiz;
          while(time(NULL) < thiz->end_time) {
                    sem_wait(&thiz->sem1);
                    printf("thread2 get the lock. \n");
  
                    sem_post(&thiz->sem2);
                    printf("thread2 unlock.\n");
 
                    sleep(1);
          }
  
          pthread_exit(NULL);
}


本文转自jazka 51CTO博客,原文链接:http://blog.51cto.com/jazka/234598,如需转载请自行联系原作者
相关文章
|
24天前
|
Linux C++
LInux下Posix的传统线程示例
LInux下Posix的传统线程示例
19 1
|
2月前
|
Java Linux 调度
linux线程池浅谈
linux线程池浅谈
|
1月前
|
算法 Unix Linux
Linux与Qt线程优先级的对应关系:一次全面解析
Linux与Qt线程优先级的对应关系:一次全面解析
23 0
|
2月前
|
Linux 调度 数据库
Linux下的系统编程——线程同步(十三)
Linux下的系统编程——线程同步(十三)
52 0
Linux下的系统编程——线程同步(十三)
|
1月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
67 0
|
1月前
|
资源调度 算法 Linux
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
91 0
|
1月前
|
存储 安全 数据管理
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
19 1
|
1月前
|
缓存 Linux C语言
Linux线程的创建过程
【2月更文挑战第10天】
|
3天前
|
固态存储 Ubuntu Linux
Linux(29) 多线程快速解压缩|删除|监视大型文件
Linux(29) 多线程快速解压缩|删除|监视大型文件
11 1
|
24天前
|
传感器 Linux API
嵌入式Linux串口编程简介
嵌入式Linux串口编程简介
19 1