#include "type.h"
#include <pthread.h>
#include <list>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <unistd.h>
#include "ThreadMutex.h"
using namespace std;
typedef struct tagWorkInfo
{
tagWorkInfo()
{
m_nIndex = 0;
m_strInfo.clear();
}
int m_nIndex;
string m_strInfo;
}WorkInfo, *LPWorkInfo;
CCrtSession g_crtPrint;
CCrtSession g_crtWork;
list<WorkInfo> g_lsWork;
void AddWork(const WorkInfo& info);
BOOL GetWork(WorkInfo& info);
void Print(const WorkInfo& info);
void Print(const char* lpszInfo);
void* AddTaskProc(void* pVoid);
void* DoTaskProc(void* pVoid);
int main()
{
pthread_t th1;
pthread_t th2;
void* pRet = NULL;
//创建生产者和消费者线程
pthread_create(&th1, NULL, &AddTaskProc, NULL);
pthread_create(&th2, NULL, &DoTaskProc, NULL);
//等待两个线程结束
pthread_join(th1, &pRet);
pthread_join(th2, &pRet);
return 0;
}
void Print(const WorkInfo& info)
{
CThreadMutex mutex(g_crtPrint.GetMutex());
string strPrint;
char szIndex[20] = {0};
//itoa(info.m_nIndex, szIndex, 10);
sprintf(szIndex, "index:%d\t info:", info.m_nIndex);
strPrint = szIndex;
strPrint += info.m_strInfo;
printf("%s\n", strPrint.c_str());
}
void Print(const char* lpszInfo)
{
CThreadMutex mutex(g_crtPrint.GetMutex());
if (NULL == lpszInfo)
{
return;
}
printf("%s\n", lpszInfo);
}
void AddWork(const WorkInfo& info)
{
CThreadMutex mutex(g_crtWork.GetMutex());
g_lsWork.push_back(info);
}
BOOL GetWork(WorkInfo& info)
{
CThreadMutex mutex(g_crtWork.GetMutex());
if (g_lsWork.size() <= 0)
{
return FALSE;
}
list<WorkInfo>::iterator it = g_lsWork.begin();
info = *it;
g_lsWork.erase(it);
return TRUE;
}
void* AddTaskProc(void* pVoid)
{
printf("start AddTaskProc work....\n");
int i = 0;
while (TRUE)
{
WorkInfo info;
info.m_nIndex = i++;
info.m_strInfo = "test info";
AddWork(info);
Print("push new work into list");
}
return NULL;
}
void* DoTaskProc(void* pVoid)
{
printf("start DoTaskProc work....\n");
while (TRUE)
{
WorkInfo info;
if (GetWork(info))
{
Print(info);
Print("get new work from list");
}
else
{
Print("list is empty.. sleep 1 second!");
sleep(1);
}
}
return NULL;
}
分享到:
相关推荐
LINUX虚拟服务器集群模型及其任务分配算法的探讨.pdf
面向多核多任务场景的Linux任务调度算法设计 Linux操作系统中,任务调度算法是影响系统性能的关键组件之一。在多核多任务场景下,Linux任务调度算法面临着实时响应不足的问题。本文提出了基于GAS模型的改进任务调度...
基于消息驱动的二级任务调度模型
Linux操作系统下各项服务的解释 1、alsasound:Alsa声卡驱动程序支持。Alsa声卡驱动程序本来是为了一种声卡Gravis UltraSound(GUS)而写的,该程序被证 明很优秀,于是作者就开始为一般的声卡写驱动程序。Alsa和OSS/...
最后,多线程可以并发地执行任务,提高服务器的并发能力。 在设计多线程服务器程序时,需要考虑线程的特点和属性。线程有助于解析这些问题,线程有时称为轻进程。线程的优点是可以快速地响应客户请求,提高服务器的...
所以,剩下的select模型基本上就成为我们在linux上面的唯一选择,其实,如果加上no-block socket的配置,可以完成一个"伪"AIO的实现,只不过推动力在于你而不是os而已。不过传统的select/poll函数有着一些无法忍受...
Linux任务前后台的切换。最大的用处是在训练深度学习时,或者远程操作Linux时,有些任务想看,又不想让他结束,此时必须把用后台命令,把正在训练的模型任务放在后台执行,不用Ctrl+C 杀死这个任务。
实时RTAI-Linux操作系统的分析与研究.pdf
基于ADEOS的RTAI-Linux的研究及其实时性测试
在Linux环境下实现任务调度仿真,利用多线程实现任务池中的多个任务,支持先来先服务、轮转和反馈三种调度策略 设有任务A、B、C、D、E,分别具有不同的优先级和处理时间,通过一个调度线程对这5个任务进行调度。 1...
本文分析了I/O复用模型的原理和特点,并针对Windows与Linux平台间通信的并发数量不足的问题,提出在Windows与Linux平台间使用socket(套接字)异步通信的方法。通信采用客户端/服务器(Client/Server)模型。在该...
Ubuntu16.04 Linux平台 C语言编写,采用CS模型,TCP、UDP网络协议实现的内网多人聊天室。 服务器:采用多线程以及线程锁处理客户端的所有请求以及信息转发任务。服务端实时显示客户的登录与登出信息;保存客户上传的...
本书主要讲述采用现代C++ 在x86-64 Linux 上编写多线程TCP 网络服务程序的主流常规技术,重点讲解...掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务统。
作者: 陈硕 《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 ...掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务系统。
ISBN 978-7-121-19282-1 Linux多线程服务端编程:使用muduo C++网络库 本书主要讲述采用现代 C++ ...掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务系统。
DragGAN是一个全功能实现的模型,提供在线演示和本地部署试用,其代码和模型。它支持在Windows、macOS和Linux上运行,可用于图像生成和转换任务。
3.1.3 宿主机服务配置 83 3.2 bootloader 87 3.2.1 bootloader的概念 88 3.2.2 bootloader启动流程分析 89 3.2.3 u-boot概述 89 3.2.4 u-boot源码导读 90 3.3 编译嵌入式linux内核 91 3.4 ...
本线程池采用C语言实现。包括以下内容 > - thread_pool_create:创建...主要的核心点集中在thread_pool_post和thread_worker两个函数中,这两个函数也构成了生产者-消费者模型。本文采用队列+互斥锁+条件变量实现。
2.1 虚拟内存抽象模型 15 2.1.1 请求调页 17 2.1.2 交换 17 2.1.3 共享虚拟内存 18 2.1.4 物理寻址模式和虚拟寻址模式 18 2.1.5 访问控制 18 2.2 高速缓存 19 2.3 Linux页表 20 2.4 页分配和回收 21 2.4.1 页分配 22...