#include
#include
#include
int buf[1000000];
int w=0,r=0; //r是读指针,w是写指针
int size=10; //缓冲区大小
pthread_mutex_t lock; //锁
pthread_cond_t is_empty; //缓冲区是否为空
pthread_cond_t is_full; //缓冲区是否已满
void *sender(void *a) //发送100个数据
{
int i,j,k;
for(i=1;i<=100;i++) //总共100个数据
{
pthread_mutex_lock(&lock); //锁
if(w-r>size) //缓冲区是否已满
pthread_cond_wait(&is_full,&lock); //满了,等待接受线程把数据取走
buf[w++]=i; //缓冲区有空间,发送
printf("%d--->/n",i); //打印出来
pthread_cond_signal(&is_empty); //缓冲区里至少有一个数据,读线程可以把他取走
pthread_mutex_unlock(&lock); //解锁
}
return ;
}
void *receiver(void *a) //接受数据
{
int x;
while(1)
{
pthread_mutex_lock(&lock); //锁
if(r==w) //缓冲区是否有数据
pthread_cond_wait(&is_empty,&lock); //没有数据,等待发送线程发数据
x=buf[r++]; //有数据了,取走
if(x!=0)
printf("--->%d/n",x); //打印出来
else
break; //数据发送->接受完了,结束线程
pthread_cond_signal(&is_full); //缓冲区至少还有一个空间可以让发送进程发送数据
pthread_mutex_unlock(&lock); //解锁
}
return ;
}
int main()
{
memset(buf,0,sizeof(buf));
pthread_t a,b; //创建两个线程
//初始化
pthread_mutex_init(&lock,NULL);
pthread_cond_init(&is_full,NULL);
pthread_cond_init(&is_empty,NULL);
//线程开始工作
pthread_create(&a,NULL,sender,0);
pthread_create(&b,NULL,receiver,0);
void *recycle; //线程结束时,存放回收的数据
pthread_join(a,&recycle); //回收资源
pthread_join(b,&recycle); //回收资源
return 0;
}
分享到:
相关推荐
在Linux环境下,多线程间通信是实现并发执行任务并协调数据访问的关键技术。线程间的通信主要通过共享内存和同步机制来实现,因为线程天然具有共享数据结构的能力,这意味着全局变量可以在多个线程之间共享。然而,...
`pthread_self`函数返回当前线程的ID,这对于线程间识别和同步操作非常有用。 4. **线程分离** `pthread_detach`函数将一个线程设置为脱离状态。脱离线程在结束时会自动清理资源,无需其他线程调用`pthread_join`...
本示例“Linux 进程间通信”着重演示了System V IPC机制,包括信号量(Semaphore, sem)、共享内存(Shared Memory, shm)和管道(FIFO)三种方式。这些技术广泛应用于构建复杂、高效的系统和服务,尤其是在需要不同...
多进程是指在一个操作系统中同时运行多个独立的程序实体,每个进程都有自己的内存空间,资源独立,进程间通信(IPC)通常通过管道、信号量、共享内存等方式进行。在Linux下,可以使用`fork()`系统调用来创建新进程,...
在Linux操作系统中,线程是进程内的执行单元,它们共享同一地址空间,使得多任务...在实际应用中,你可能需要传递参数、同步线程或者管理线程间的通信。通过理解和运用这些基本概念,你可以构建更复杂的多线程程序。
条件变量`pthread_cond_t`则用于线程间的通信,允许一个线程等待另一个线程满足特定条件后再继续执行。 5. **线程安全** 在多线程环境中,正确使用同步原语(如互斥锁和条件变量)是非常重要的。在上述示例中,...
最后,信号是轻量级的进程间通信方式,常用于通知事件的发生。例如,进程可以通过发送SIGINT信号来请求另一进程停止运行。`raise()`, `signal()`, 和 `sigaction()`等函数是处理信号的核心接口。信号通信快速但数据...
- **线程间的通信可以通过共享内存、管道、消息队列、套接字等方式实现。** 6. **线程调度策略**: Linux提供多种线程调度策略,如SCHED_OTHER(默认,轮转),SCHED_FIFO(先入先出,实时),SCHED_RR(时间片...
5. **示例代码分析**:`event_test`文件很可能是包含一个或多个示例,演示了如何在Windows和Linux上创建线程事件,以及如何使用这些事件进行线程间的通信。代码可能包括创建事件对象,设置/重置事件状态,以及在适当...
总结一下,QT5中的`QThread`提供了便捷的线程管理和通信机制,通过信号与槽实现了线程间的同步,避免了直接的线程间交互,简化了并发编程的复杂性。这个示例为理解和实践QT5线程编程提供了一个基础的起点,实际项目...
测试环境:64位ubuntu 13LTS 功能说明:使用互斥锁+条件变量+共享内存的方式实现进程(或线程)间的通信示例
线程间通信可以通过共享内存、信号量、条件变量等机制来实现。例如,使用`pthread_mutex_t`类型定义互斥锁,可以确保在任何时候只有一个线程访问特定资源,避免竞态条件: ```c pthread_mutex_t mutex; void* ...
在这个"内存共享_进程间通信示例"压缩包中,很可能包含了实现这些步骤的C语言或其他编程语言的示例代码。这些代码可能展示了如何创建共享内存、映射到进程、进行数据交换以及如何进行同步操作的过程。通过学习这些...
在本文中,我们将深入探讨基于Xilinx ZYNQ平台的双核异构处理系统(Heterogeneous Processing System, HPS)实现的AMP(Asymmetric Multi-Processing)模式下的Linux与裸机程序之间的核间通信。Xilinx ZYNQ是集成ARM...
线程间通信比进程间通信更加方便快捷,因为线程共享进程数据空间,数据可以直接在它们之间传递。这减少了通信的时间和复杂性。然而,数据共享也带来了需要特别注意的问题,例如某些变量不能同时被两个线程修改,以及...
- **通信机制**:线程间的通信更为简单直接,无需通过复杂的进程间通信(IPC)机制。 3. **多线程的优势** - **高效性**:多线程能够充分利用多核处理器的能力,提高程序执行效率。 - **结构清晰**:将复杂任务...
线程间的通信也更为便捷。同一进程内的线程可以直接访问共享数据,无需通过复杂的通信机制,但这也带来了数据同步的问题,需要妥善处理临界区和共享资源的访问控制。 多线程的应用场景广泛,包括: 1) 提高应用...
本文将深入探讨线程的基础知识,特别是线程通信的概念,以及如何在Linux环境下使用原子操作和自旋锁来确保线程间的正确同步。 首先,线程是操作系统分配CPU时间的基本单位,一个进程可以包含多个线程,它们共享同一...