M12345b 2021-05-21 09:57 采纳率: 30%
浏览 93
已结题

C语言一个线程通过队列向另一个线程实时发送数据的例子求代码实例

具有缓存功能,当写入速度大于读取速度时可以实现缓存。   希望能够提供代码实例!!!!!

  • 写回答

2条回答 默认 最新

  • qfl_sdu 2021-05-21 11:58
    关注

    写了一个子线程写队列,主线程读队列的简单例子。代码如下,如有帮助,请采纳一下,谢谢。

    main.cpp:

    #include <pthread.h>
    #include <queue>
    #include <string>
    #include <stdio.h>
    #include <unistd.h>
    using namespace std;
    
    queue<string> g_qMsg;         //队列
    pthread_mutex_t g_mutexWork;  //互斥锁
    
    int g_index = 0;
    
    //子线程写输入
    void* DoMyJob(void* pParam)
    {
    	char buf[100] = {0};
    	while(true)
    	{
    		sprintf(buf,"this is %d",g_index);
    		g_index++;
    		if (g_index >= 80)
    		{
    			printf("write 80,stop write\n");
    			usleep(10000000);
    			break;
    		}
    		pthread_mutex_lock(&g_mutexWork);
    		g_qMsg.push(buf);
    		pthread_mutex_unlock(&g_mutexWork);
    		usleep(10000); //10毫秒写入一次
    	}
    	return 0;
    }
    
    
    
    int main()
    {
    	pthread_mutex_init(&g_mutexWork,NULL); //初始化线程锁
    	//启动线程
    	pthread_t threadId;
    	pthread_create(&threadId, NULL, DoMyJob, 0);
    
    	string strMsg = "";
    	//主线程读数据
    	while(1)
    	{
    		
    		if (g_qMsg.size() > 0)
    		{
    			pthread_mutex_lock(&g_mutexWork);
    			strMsg = g_qMsg.front();
    			g_qMsg.pop();
    			pthread_mutex_unlock(&g_mutexWork);
    			printf("main read:%s\n",strMsg.c_str());
    		}
    		
    
    		usleep(500000);  //500毫秒读取一次
    	}
    
    	return 0;
    
    }
    

    Makefile文件(这是一个通用的makefile,你自己make也行):

    #编译器LINUX
    CXX=g++
    #编译动态库
    CXXDL= -g -lpthread $(LIB)
    COMPILE=-c -g
    #编译目标文件
    CXXFLAGS=-g $(INCLUDE)  -fPIC
    #头文件搜索路径
    INCLUDE=-I./ 
    #动态库
    LIB=-L./
    
    #目标文件
    OBJ_FILES=main.o
    
    
    #可执行文件或者动态库
    TARGET=./threadtest
    
    $(TARGET):$(OBJ_FILES)
    	@echo "Link the $@ starting..."
    	$(CXX) -o $(TARGET) $(OBJ_FILES) $(CXXDL)
    	@echo "Link the $@ done."	
    $OBJ_FILES:%.o:%.cpp
    	$(CXX) $< -o $@ $(COMPILE) -I$./
    clean:
    	rm $(OBJ_FILES) $(TARGET)
    
    评论

报告相同问题?

悬赏问题

  • ¥15 SQLite 出现“Database is locked” 如何解决?
  • ¥15 已经加了学校的隶属邮箱了,为什么还是进不去github education?😭
  • ¥15 求会做聚类,TCN的朋友有偿线上指导。以下是目前遇到的问题
  • ¥100 无网格伽辽金方法研究裂纹扩展的程序
  • ¥15 错误于library(org.Hs.eg.db): 不存在叫‘org.Hs.eg.db’这个名称的程序包,如何解决?
  • ¥60 求一个图片处理程序,要求将图像大小跟现实生活中的大小按比例联系起来的
  • ¥50 求一位精通京东相关开发的专家
  • ¥100 求懂行的大ge给小di解答下!
  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏