linux应用程序使用到的保护机制 semaphore和pthread_mutex

1〉互斥锁线程控制: Mutex 是一种简单的加锁的方法来控制对共享资源的存取。这个互斥锁只有两行状态,上锁和解锁。可以把这种互斥锁看成是某种全局变量,在同一时间只有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行操作,若其他线程希望上锁一个已经上了锁的互斥锁。该线程就会挂起。直到上锁定线程释放掉互斥锁为止。 可以这么理解,互斥锁使共享资源按照一定的顺序在线程中被使用。 互斥锁操作主要包括以下几个步骤: 1, 互斥锁初始化:pthread_mutex_init 2, 互斥锁上锁: pthread_mutex_lock 3, 互斥锁判断上锁:pthread_mutex_trylock 4, 互斥锁解锁:pthread_mutex_unlock 5, 消除互斥锁:pthread_mutex_destroy 2〉信号量线程控制 信号量本质是上一个非负的整数计数器,它被用来控制对公共资源的访问。 信号量实际上就是操作系统中所用到的PV原语,它广泛的应用于进程或线程间的同步与互斥。 注:PV原语是对整数计数器信号量sem的操作,一次P操作使sem减一,而一次V操作使sem加一,进程(或线程)根据信号量的值来判断是否可对公共资源具有访问权。当信号量sem的值大于等于零时,该进程(或线程)就具有对公共资源的访问权,如果sem的值小于零时,该进程(或线程)就一直阻塞直到信号量sem的值大于等于零为止。 LINUX实现了POSIX的无名信号量,主要用于线程间的互斥与同步。只要用到以下几个常用函数: sem_int 用于创建一个信号量,并能初始化它的值。 sem_wait和sem_trywait相当于P操作,它们都能将信号量减一,两者的区别在于信号量小于零时, sem_wait将会阻塞进程,而sem_trywait会立即返回。 sem_post 相当于V操作,将信号量的值加一同时发出信号唤醒等待线程。 sem_getvalue 用于得到信号量的值。 sem_destroy 用于删除信号量。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写一个2线程程序:主线程每秒输出依次偶数0,2,4,8等偶数,另外一个线程每秒一次输出1、2、3、5等奇数,并且通过同步方法实现总的输出结果为 0、1、2、3、4按大小顺序一次输出。(提示:可以使用互斥锁实现同步)//参考例题2:thread2.c#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#include <semaphore.h>void *thread_function(void *arg);pthread_mutex_t work_mutex; /* protects both work_area and time_to_exit */#define WORK_SIZE 1024char work_area[WORK_SIZE];int time_to_exit = 0;int main() { int res; pthread_t a_thread; void *thread_result; res = pthread_mutex_init(&work_mutex, NULL); if (res != 0) { perror("Mutex initialization failed"); exit(EXIT_FAILURE); } res = pthread_create(&a_thread, NULL, thread_function, NULL); if (res != 0) { perror("Thread creation failed"); exit(EXIT_FAILURE); } pthread_mutex_lock(&work_mutex); printf("Input some text. Enter 'end' to finish\n"); while(!time_to_exit) { fgets(work_area, WORK_SIZE, stdin); pthread_mutex_unlock(&work_mutex); while(1) { pthread_mutex_lock(&work_mutex); if (work_area[0] != '\0') { pthread_mutex_unlock(&work_mutex); sleep(1); } else { break; } } } pthread_mutex_unlock(&work_mutex); printf("\nWaiting for thread to finish...\n"); res = pthread_join(a_thread, &thread_result); if (res != 0) { perror("Thread join failed"); exit(EXIT_FAILURE); } printf("Thread joined\n"); pthread_mutex_destroy(&work_mutex); exit(EXIT_SUCCESS);}void *thread_function(void *arg) { sleep(1); pthread_mutex_lock(&work_mutex); while(strncmp("end", work_area, 3) != 0) { printf("You input %d characters\n", strlen(work_area) -1); work_area[0] = '\0'; pthread_mutex_unlock(&work_mutex); sleep(1); pthread_mutex_lock(&work_mutex); while (work_area[0] == '\0' ) { pthread_mutex_unlock(&work_mutex); sleep(1); pthread_mutex_lock(&work_mutex); } } time_to_exit = 1; work_area[0] = '\0'; pthread_mutex_unlock(&work_mutex); pthread_exit(0);}
最新发布
06-10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值