这是一个书上的例子,逻辑是:一个线程生产一组数字1、2、3..... 等等,放入一个循环队列中。另一个线程去处理这些数字,达到的效果是把这些数字求和。还是看看代码吧。
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <semaphore.h>
#define BUFSIZE 4
#define NUMBER 8
int sum_of_number=0;
/* 可读 和 可写资源数*/
sem_t write_res_number;
sem_t read_res_number;
/* 循环队列 */
struct recycle_buffer{
int buffer[BUFSIZE];
int head,tail;
}re_buf;
/* 用于实现临界区的互斥锁,我们对其初始化*/
pthread_mutex_t buffer_mutex=PTHREAD_MUTEX_INITIALIZER;
static void *producer(void * arg)
{
int i;
for(i=0;i<=NUMBER;i++)
{
/* 减少可写的资源数 */
sem_wait(&write_res_number);
/* 进入互斥区 */
pthread_mutex_lock(&buffer_mutex);
/*将数据复制到缓冲区的尾部*/
re_buf.buffer[re_buf.tail]=i;
re_buf.tail=(re_buf.tail+1)%BUFSIZE;
printf("procuder %d write %d.\n",pthread_self(),i);
/*离开互斥区*/
pthread_mutex_unlock(&buffer_mutex);
/*增加可读资源数*/
sem_post(&read_res_number);
}
/* 线程终止,如果有线程等待它们结束,则把NULL作为等待其结果的返回值*/
return NULL;
}
static void * consumer(void * arg)
{
int i,num;
for(i=0;i<=NUMBER;i++)
{
/* 减少可读资源数 */
sem_wait(&read_res_number);
/* 进入互斥区*/
pthread_mutex_lock(&buffer_mutex);
/* 从缓冲区的头部获取数据*/
num = re_buf.buffer[re_buf.head];
re_buf.head = (re_buf.head+1)%BUFSIZE;
printf("consumer %d read %d.\n",pthread_self(),num);
/* 离开互斥区*/
pthread_mutex_unlock(&buffer_mutex);
sum_of_number+=num;
/* 增加客写资源数*/
sem_post(&write_res_number);
}
/* 线程终止,如果有线程等待它们结束,则把NULL作为等待其结果的返回值*/
return NULL;
}
int main(int argc,char ** argv)
{
/* 用于保存线程的线程号 */
pthread_t p_tid;
pthread_t c_tid;
int i;
re_buf.head=0;
re_buf.tail=0;
for(i=0;i<BUFSIZE;i++)
re_buf.buffer[i] =0;
/* 初始化可写资源数为循环队列的单元数 */
sem_init(&write_res_number,0,BUFSIZE); // 这里限定了可写的bufsize,当写线程写满buf时,会阻塞,等待读线程读取
/* 初始化可读资源数为0 */
sem_init(&read_res_number,0,0);
/* 创建两个线程,线程函数分别是 producer 和 consumer */
/* 这两个线程将使用系统的缺省的线程设置,如线程的堆栈大小、线程调度策略和相应的优先级等等*/
pthread_create(&p_tid,NULL,producer,NULL);
pthread_create(&c_tid,NULL,consumer,NULL);
/*等待两个线程完成退出*/
pthread_join(p_tid,NULL);
pthread_join(c_tid,NULL);
printf("The sun of number is %d\n",sum_of_number);
}
编译命令:gcc -g -o threadtest threadtest.c -lpthread
分享到:
相关推荐
对Linux下C语言编程--线程操作作了详细的说明
vc++ 多线程教程---线程通信--利用事件对象,线程同步--使用信号量,线程同步--使用互斥量,线程同步--使用临界区
嵌入式Linux高级编程--05posix_线程编程.ppt
Linux中提供一把互斥锁mutex(也称之为互斥量)。 每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。 资源还是共享的,线程间也还是竞争的, 但通过“锁”就将资源的访问变成互斥操作...
下载于北大未名BBS精华区 内容:UNIX环境高级编程,Linux网络编程,Linux编程杂项,Linux窗口编程,Linux多线程编程,Linux脚本编程
Linux系统编程-线程
Linux编程技术-实验报告
本书主要讲述采用现代C++ 在x86-64 Linux 上编写多线程TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。这是在Linux 下以native 语言编写用户态高性能...
c++多线程同步——信号量。非常简单的MFC工程。
介绍了linux线程同步的所有方式,包括互斥、自旋、信号量、条件变量等技术
编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。clone()是Linux所特有的系统调用,它的使用方式类似fork...
②linux系统编程学习:C语言进程、信号、线程、线程锁、进程锁、信号量; ③linux网络编程学习:tcp编程、udp编程(socket套接字编程); ④linux-shell编程学习; 资源几乎包含了博主的整个linux学习的资料,是根据...
南京邮电大学嵌入式课件\嵌入式linux应用程序编程-线程及socket编程
linux多线程编程手册,详细资料,描述听详细的,对于初学者或者有经验程序员均适用 1、多线程基础介绍 2、基本线程编程 3、线程属性 4、同步 .....
使用信号量(Semaphore)实现线程的同步
基于信号量的Linux多线程同步研究
linux 进程和线程编程 pipe --原始管道 命名管道 消息队列 信号量 内存共享 线程编程
linux下多线程编程linux下多线程编程linux下多线程编程linux下多线程编程linux下多线程编程
多线程编程四-线程同步.pdf