最近用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语言多线程队列读写的更多相关文章

  1. 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

    Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

  2. android 多线程数据库读写分析与优化

    最新需要给软件做数据库读写方面的优化,之前无论读写,都是用一个 SQLiteOpenHelper.getWriteableDataBase() 来操作数据库,现在需要多线程并发读写,项目用的是2.2的 ...

  3. C语言基础文件读写操作

    整理了一份C语言的文件读写件操作代码,测试时打开相应的注释即可. #include <stdio.h> #include <stdlib.h> #include <uni ...

  4. C 语言多线程与锁机制

    C 语言多线程与锁机制 多线程 #include <pthread.h> void *TrainModelThread(void *id) { ... pthread_exit(NULL) ...

  5. linux下C语言多线程编程实例

    用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...

  6. C语言多线程编程一

    1. Windows下同时打开多个对话框: #include <Windows.h> #include <process.h> //创建线程 void runmsg(void ...

  7. C++多线程队列实现

    C++多线程队列实现 C++多线程队列学习 介绍 在项目中,进行多线程队列实现是一个比较麻烦的事, 找到了一个实现比较好的多线程队列实现, 自己做了一点修改更加适应自己的项目, 记录下来, 有需要的自 ...

  8. C语言文件的读写

    对文件的读和写是最常用的文件操作.在C语言中提供了多种文件读写的函数: 字符读写函数  :fgetc和fputc 字符串读写函数:fgets和fputs 数据块读写函数:freed和fwrite 格式 ...

  9. 如何用Java语言向串口读写数据

    原作者:赛迪网作者 shihuchen ,我在他的基础上进行了部分修改 [赛迪网讯]串口, RS-232-C(又称EIA RS-232-C,以下简称RS232)是在1970年由美国电子工业协会(EIA ...

随机推荐

  1. Android SharePreference 在主进程和次进程间共享数据不同步出错

      SharedPreference作为android五大存储(网络,数据库,文件,SharedPreference,contentProvider)之中最方便使用的一个,从类名上来看就不是一个存储大 ...

  2. miniui设置边框的方法

    if (field == "loginname") { if (record._id == 2) { e.cellHtml = ""; e.cellStyle ...

  3. Mac 搭建 SVN 服务器环境

    Mac 搭建 SVN 服务器环境 一.创建svn repository svnadmin create /path/svn/pro //仓库位置,svn是svn的目录,pro是一个版本库的目录 PS: ...

  4. 关于电脑安装多个版本JDK后使用时的切换

    描述:刚到新公司,自己安装了jdk1.7和开发工具myeclipse10,但是由于公司项目的需要(具体原因不详细描述了),需要使用myeclipse6.5和jdk1.6.于是在切换jdk1.7和jdk ...

  5. sql Sever的存储过程转换为mysql的

    总体来说,sql sever和Mysql的存储过程的思路都是一样的,但是在语法和结构上还是有很大的区别的.1. 在mysql中写存储过程所有的dbo都要去掉.2. 每一个sql语句后面都需要加上:否则 ...

  6. android-Okhttp初步使用

    自从谷歌把android的请求框架换成Okhttp后,android开发人员对其的讨论就变的越来越火热,所有咱作为一枚吊丝android程序员,也不能太落后,所以拿来自己研究一下,虽然目前项目开发用的 ...

  7. 黑马程序员——OC语言 核心语法(1)

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)点语法 点语法其实本质上还是方法调用 当使用点语法时,编译器会自动展 ...

  8. [安卓]Android窗口、视图、布局

    1.窗口全屏的两种方法: 转自:http://blog.sina.com.cn/s/blog_4c451e0e010133ab.html 设置全屏包括两个部分: 窗口全屏和Activity全屏.窗口全 ...

  9. Notes of learning AutoLayout

    在XCode5中,如果我们添加一个Button或者Label,或者其他的什么标准View,而不设置任何constraints,IB会自动生成constraints,而这些constraints是fix ...

  10. layoutSubviews总结

    ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size - (void)sizeToFit ——————- - (void)layoutSubview ...