c语言多线程队列读写
最近用c语言写了个简单的队列服务,记录一下,文件结构为 main.c queue.c queue.h,代码如下:
主函数
#define NUM_THREADS 200 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue.h>
#include <pthread.h>
#include <sys/time.h>
#include <unistd.h>
struct threadArgs
{
struct queue *q;
char *c ;
}; void* putArg(void *params)
{
struct threadArgs *args = params;
putQueue(args->q, args->c);
} int main()
{
pthread_t tids[NUM_THREADS]; //线程id
struct queue * g_q;
g_q = initQueue();
char c[LENTH] = "test\0";
char b[LENTH] = "btest\0";
char a[LENTH] = "atest\0";
char *h = "";
int i = ;
for( i = ; i < NUM_THREADS; ++i ) {
struct threadArgs *args;
args = (struct threadArgs *)malloc(sizeof(struct threadArgs));
args->q = g_q;
args->c = c;
pthread_create(&tids[i], NULL, putArg, args);
} while() {
h = getQueue(g_q);
printf("%s\n", h);
if (strcmp(h, "") == ) {
printf("queue is empty , sleep for a while");
sleep();
} else {
sleep();
}
}
return ;
}
queue.h
#define LENTH 10240
struct node
{
char * m_content;
struct node * p_next;
}; struct queue
{
struct node * p_head;
struct node * p_tail;
}; struct queue * initQueue(); void putQueue(struct queue *q, char content[LENTH]);
char * getQueue(struct queue *q);
struct node * initNode();
queue.c
#include <stdio.h>
#include <string.h>
#include <queue.h>
#include <stdlib.h> struct node * initNode(char c[LENTH]){
struct node *h;
h=(struct node *)malloc(sizeof(struct node));
if (h==NULL) {
printf("can not malloc struct node memory;");
exit();
}
h->m_content = (char * )malloc(sizeof(char)*LENTH);
strcpy(h->m_content, c);
printf("init success \n");
h->p_next = NULL;
return h;
} struct queue * initQueue() {
struct queue * q;
q=(struct queue *)malloc(sizeof(struct queue));
if (q == NULL) {
printf("can not malloc struct node memory;");
exit();
}
q->p_head = NULL;
q->p_tail = NULL;
return q;
}; void putQueue(struct queue *q, char c[LENTH]) {
struct node * n;
n = initNode(c);
if (q->p_tail == NULL) { // queue is empty
q->p_head = n;
q->p_tail = n;
} else {
q->p_tail->p_next = n;
q->p_tail = n;
}
printf("put: %s\n", q->p_tail->m_content);
} char * getQueue(struct queue *q) {
char *c;
if (q->p_head==NULL) {
c = "";
return c;
}
struct node * h;
h = q->p_head;
c = h->m_content;
printf("get: %s\n", c);
q->p_head = q->p_head->p_next;
free(h); //这里不能c指针 回收以后c指针的返回值 会出问题
return c;
} //几点收获 指针需要malloc 普通变量不需要, 特别是字符串数组不需要
编译 gcc -o q main.c queue.c -I ./ -lpthread
c语言多线程队列读写的更多相关文章
- 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解
Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解 多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...
- android 多线程数据库读写分析与优化
最新需要给软件做数据库读写方面的优化,之前无论读写,都是用一个 SQLiteOpenHelper.getWriteableDataBase() 来操作数据库,现在需要多线程并发读写,项目用的是2.2的 ...
- C语言基础文件读写操作
整理了一份C语言的文件读写件操作代码,测试时打开相应的注释即可. #include <stdio.h> #include <stdlib.h> #include <uni ...
- C 语言多线程与锁机制
C 语言多线程与锁机制 多线程 #include <pthread.h> void *TrainModelThread(void *id) { ... pthread_exit(NULL) ...
- linux下C语言多线程编程实例
用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...
- C语言多线程编程一
1. Windows下同时打开多个对话框: #include <Windows.h> #include <process.h> //创建线程 void runmsg(void ...
- C++多线程队列实现
C++多线程队列实现 C++多线程队列学习 介绍 在项目中,进行多线程队列实现是一个比较麻烦的事, 找到了一个实现比较好的多线程队列实现, 自己做了一点修改更加适应自己的项目, 记录下来, 有需要的自 ...
- C语言文件的读写
对文件的读和写是最常用的文件操作.在C语言中提供了多种文件读写的函数: 字符读写函数 :fgetc和fputc 字符串读写函数:fgets和fputs 数据块读写函数:freed和fwrite 格式 ...
- 如何用Java语言向串口读写数据
原作者:赛迪网作者 shihuchen ,我在他的基础上进行了部分修改 [赛迪网讯]串口, RS-232-C(又称EIA RS-232-C,以下简称RS232)是在1970年由美国电子工业协会(EIA ...
随机推荐
- GPRS模块上电后复位会导致开机函数不正常的问题原因及解决方法
之前使用的开机函数 void Gprs_modem_start_up(){GPIO_SetBits(GPIOB,GPIO_Pin_0); //RESET 脚要置成高电平,防止重启do{ GPIO_Se ...
- 防止SVN冲突,Elipse资源同步介绍
灰色向右箭头: 本地修改了 灰色向右箭头且中间有白色减号: 本地删除了,服务器未删除 灰色向右且中间有个加号的箭头:本地比SVN上多出的文件 蓝色向左箭头:svn上修改过 蓝色向左且中间有个加号的箭头 ...
- WEB项目 后台接收前端数组
//保存区域选择的设备 $scope.saveDevice = function(){ var device = []; $("input[type='checkbox']:checked& ...
- vs---错误收集并自己解决后归纳
1.C++编译时,出现这样的错误 d:\program files\microsoft visual studio\vc98\include\stdio.h(36) : error C2143: sy ...
- PE文件学习系列一为什么是PE
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入)Q Q:408365330 E-Mail:egojit@qq.com PE概述: ...
- 《Linux内核设计与实现》课本第一章&第二章学习笔记
<Linux内核设计与实现>课本学习笔记 By20135203齐岳 一.Linux内核简介 Unix内核的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件 ...
- 分布式系统中一些主要的副本更新策略——Dynamo/Cassandra/Riak同时采取了主从式更新的同步+异步类型,以及任意节点更新的策略。
分布式系统中一些主要的副本更新策略. 1.同时更新 类型A:没有任何协议,可能出现多个节点执行顺序交叉导致数据不一致情况. 类型B:通过一致性协议唯一确定不同更新操作的执行顺序,从而保证数据一致性 2 ...
- Scala HelloWorld
1) 使用MVN创建项目 mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtif ...
- 在 Ubuntu 14.04 中配置 PXE 服务器
PXE(预启动执行环境Preboot Execution Environment)服务器允许用户从网络中启动 Linux 发行版并且可以不需要 Linux ISO 镜像就能同时在数百台 PC 中安装. ...
- DTO概念
在开发过程中用到了DTO,简单了解了一下. DTO:数据传输对象,用来连接表现层和应用层之间的数据交互.数据传输对象是没有行为的POJO对象,它的目的只是为了对领域对象进行数据封装,实现层与层之间的数 ...