一个简单的信号量的例子
来源:互联网 发布:linux 查看syslog 编辑:程序博客网 时间:2024/06/05 10:29
1. 信号量
Linux提供了控制线程执行和访问代码临界区域的方法。其中最基本的两种办法是信号量和互斥量。
关于互斥量,笔者在Linux互斥量中介绍
本文只介绍semaphore.h 相关的信号量的简单的操作。关于信号量在笔者其他博客里有详细介绍。
Linux还有其他共享内存的方法。
2. 信号量相关函数
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);//创建信号量
int sem_post(sem_t *sem);// +1操作
int sem_wait(sem_t *sem);// -1操作
int sem_destroy(sem_t *sem); //销毁
3. 程序代码:
/***************************************
* @file semaphore.c
* @brief 线程信号量
* @author Windeal
* @date 2013/08/06
***************************************/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#define WORK_SIZE 1024 //
char work_area[WORK_SIZE];
sem_t bin_sem;
void *thread_function(void * arg);
int main(int argc,char* argv [ ])
{
int ret ;
void* thread_result;
pthread_t a_thread;
ret = sem_init(&bin_sem,0,0); //初始化信号量为0
if (ret != 0) {
perror("sem_init() is failed!\n");
exit(EXIT_FAILURE);
}
ret = pthread_create(&a_thread, NULL, thread_function, NULL);
if (ret != 0) {
perror("thread create failed!\n");
exit(EXIT_FAILURE);
}
printf("Enter 'end' to finish!\n");
while (strncmp("end", work_area,3)!= 0) {
fgets(work_area, WORK_SIZE, stdin);
sem_post(&bin_sem); // 信号量+ 1 操作
}
printf("Waitint for thread join\n");
ret = pthread_join(a_thread, &thread_result);
if (ret != 0) {
perror("thread_join failed!\n");
exit(EXIT_FAILURE);
}
printf("thread join()\n");
sem_destroy(&bin_sem);
exit(EXIT_FAILURE);
}
void *thread_function(void * arg){
sem_wait(&bin_sem); // 信号量- 1 操作
while (strncmp("end", work_area,3)!= 0){
printf("you input %d charactor \n", strlen(work_area)-1);
sem_wait(&bin_sem); // 信号量- 1 操作
}
pthread_exit(NULL);
}
* @file semaphore.c
* @brief 线程信号量
* @author Windeal
* @date 2013/08/06
***************************************/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#define WORK_SIZE 1024 //
char work_area[WORK_SIZE];
sem_t bin_sem;
void *thread_function(void * arg);
int main(int argc,char* argv [ ])
{
int ret ;
void* thread_result;
pthread_t a_thread;
ret = sem_init(&bin_sem,0,0); //初始化信号量为0
if (ret != 0) {
perror("sem_init() is failed!\n");
exit(EXIT_FAILURE);
}
ret = pthread_create(&a_thread, NULL, thread_function, NULL);
if (ret != 0) {
perror("thread create failed!\n");
exit(EXIT_FAILURE);
}
printf("Enter 'end' to finish!\n");
while (strncmp("end", work_area,3)!= 0) {
fgets(work_area, WORK_SIZE, stdin);
sem_post(&bin_sem); // 信号量+ 1 操作
}
printf("Waitint for thread join\n");
ret = pthread_join(a_thread, &thread_result);
if (ret != 0) {
perror("thread_join failed!\n");
exit(EXIT_FAILURE);
}
printf("thread join()\n");
sem_destroy(&bin_sem);
exit(EXIT_FAILURE);
}
void *thread_function(void * arg){
sem_wait(&bin_sem); // 信号量- 1 操作
while (strncmp("end", work_area,3)!= 0){
printf("you input %d charactor \n", strlen(work_area)-1);
sem_wait(&bin_sem); // 信号量- 1 操作
}
pthread_exit(NULL);
}
运行结果:
- 一个简单的信号量的例子
- 一个简单的Java信号量例子
- 一个信号量的例子
- 一个简单的信号量
- linux下对信号量测试的一个简单例子
- 一个简单的信号量实现
- vxworks信号量与任务的一个例子
- 一个信号量与定时器的例子(Golang)
- 一个线程和信号量的例子
- 一个简单的例子
- 一个包含了信号、信号量、共享内存的例子
- openmp 例子:一个简单的OpenMP例子
- 一个简单的Struts例子
- 一个简单的Hibernate例子!
- auto_ptr的一个简单例子
- 一个简单的Struts例子
- 一个简单的JSF例子
- 一个简单的EJB例子!!
- Linq to sql :查询句法---distinct
- 项目安排
- 字符设备驱动——申请设备号、注册字符设备
- Linq to sql :查询句法--in 操作
- 提高你的Java代码质量吧:提防包装类型的null值
- 一个简单的信号量的例子
- MFC多文档常用函数
- 视差滚动(Parallax Scrolling)效果的原理和实现
- 基于jQuery的日历控件【原创】
- 一个监控系统
- Windows静态库和动态库的创建和使用 (lib vs dll)
- 变压器基础1
- jdbc调用无参数输出的存储过程
- STM32 控制GSM模块收发信息 F407 discovery