1: #include "UnlockQueue.h"
2: #include <iostream>
3: #include <algorithm>
4: #include <pthread.h>
5: #include <time.h>
6: #include <stdio.h>
7: #include <errno.h>
8: #include <string.h>
9:
10: struct student_info
11: {
12: long stu_id;
13: unsignedint age;
14: unsignedint score;
15: };
16:
17: void print_student_info(const student_info *stu_info)
18: {
19: if(NULL == stu_info)
20: return;
21:
22: printf("id:%ld\t",stu_info->stu_id);
23: printf("age:%u\t",stu_info->age);
24: printf("score:%u\n",stu_info->score);
25: }
26:
27: student_info * get_student_info(time_t timer)
28: {
29: student_info *stu_info = (student_info *)malloc(sizeof(student_info));
30: if (!stu_info)
31: {
32: fprintf(stderr, "Failed to malloc memory.\n");
33: return NULL;
34: }
35: srand(timer);
36: stu_info->stu_id = 10000 + rand() % 9999;
37: stu_info->age = rand() % 30;
38: stu_info->score = rand() % 101;
39: //print_student_info(stu_info);
40: return stu_info;
41: }
42:
43: void * consumer_proc(void *arg)
44: {
45: UnlockQueue* queue = (UnlockQueue *)arg;
46: student_info stu_info;
47: while(1)
48: {
49: sleep(1);
50: unsignedint len = queue->Get((unsignedchar *)&stu_info, sizeof(student_info));
51: if(len > 0)
52: {
53: printf("------------------------------------------\n");
54: printf("UnlockQueue length: %u\n", queue->GetDataLen());
55: printf("Get a student\n");
56: print_student_info(&stu_info);
57: printf("------------------------------------------\n");
58: }
59: }
60: return (void *)queue;
61: }
62:
63: void * producer_proc(void *arg)
64: {
65: time_t cur_time;
66: UnlockQueue *queue = (UnlockQueue*)arg;
67: while(1)
68: {
69: time(&cur_time);
70: srand(cur_time);
71: int seed = rand() % 11111;
72: printf("******************************************\n");
73: student_info *stu_info = get_student_info(cur_time + seed);
74: printf("put a student info to queue.\n");
75: queue->Put( (unsignedchar *)stu_info, sizeof(student_info));
76: free(stu_info);
77: printf("UnlockQueue length: %u\n", queue->GetDataLen());
78: printf("******************************************\n");
79: sleep(1);
80: }
81: return (void *)queue;
82: }
83:
84:
85: int main()
86: {
87: UnlockQueue unlockQueue(1024);
88: if(!unlockQueue.Initialize())
89: {
90: return -1;
91: }
92:
93: pthread_t consumer_tid, producer_tid;
94:
95: printf("multi thread test.......\n");
96:
97: if(0 != pthread_create(&producer_tid, NULL, producer_proc, (void*)&unlockQueue))
98: {
99: fprintf(stderr, "Failed to create consumer thread.errno:%u, reason:%s\n",
100: errno, strerror(errno));
101: return -1;
102: }
103:
104: if(0 != pthread_create(&consumer_tid, NULL, consumer_proc, (void*)&unlockQueue))
105: {
106: fprintf(stderr, "Failed to create consumer thread.errno:%u, reason:%s\n",
107: errno, strerror(errno));
108: return -1;
109: }
110:
111: pthread_join(producer_tid, NULL);
112: pthread_join(consumer_tid, NULL);
113:
114: return 0;
115: }
相关推荐
网络游戏-基于并发无锁环形队列的网络速率实时统计方法.zip
多线程并发访问无锁队列的算法研究.pdf 多线程并发访问无锁队列的算法研究.pdf 多线程并发访问无锁队列的算法研究.pdf 多线程并发访问无锁队列的算法研究.pdf 多线程并发访问无锁队列的算法研究.pdf
一个快速多生产者,多消费者的C 11无锁并发队列
基于cas的无锁队列C++实现,基于cas的无锁队列C++实现,基于cas的无锁队列C++实现,基于cas的无锁队列C++实现,基于cas的无锁队列C++实现,
Java并发——无锁实现。无锁比有锁机制更加灵活,更加高效,Java进阶必备。
环形缓冲区读写操作的分析与实现,以及在并发条件下如何控制竞争
基于锁(Lock-Base)的算法实现扩充是相当容易的,但基于锁无关(Lock-Free)实现起来难度较大,下面将使用伪代码介绍基于Lock-Free实现可自适应扩充的环形并发队列算法,并提出了优化方案以使特定环境下能再提高...
1)可以通过水平拆分来降低锁冲突 2)可以通过Map转Array的方式来最小化锁冲突,一条记录一个锁 3)可以把锁去掉,最大化并发,但带来的数据完整性的破坏 4)可以通过签名的方式保证数据的完整性,实现无锁缓存
程序并发执行任务时,对公有变量一般情况都是需要利用悲观锁进行锁定,该代码可以通过乐观锁(即无锁)来实现公有变量的访问
锁与原子操作CAS以及无锁队列的底层实现相关资源
高并发下的无锁Hash表的实现论文。。。。。。。。。。
在两种派别对应在并发中就是加锁和无锁,也就是说加锁是一种悲观的策略,而无锁是一种乐观的策略。对于锁,如果有多个线程同事访问一个临界资源,宁可牺牲性能让线程等待,也不会让一个线程不加锁访问临界资源。对于...
无锁队列一个简单的通用C11并发无锁队列。 基于原子变量。
目录记忆池此仅标头的C ++ 17库提供了一种简单的一致的无锁的单个类型元素的内存池的实现。 元素类型作为第一个模板参数传递。细节界面 template < typename xss=removed xss=removed> >class MemoryPool final{...
C ++的工业级无锁队列。 注意:如果您需要的只是一个单一生产者,单一消费者队列,那么我也可以选择。 特征 击倒你的。 单头实现。 只需将其放入您的项目中即可。 完全线程安全的无锁队列。 从任何数量的线程...
一个在线2k的游戏,每秒钟并发都吓死人。传统的hibernate直接插库基本上是不可行的。我就一步步推导出一个无锁的数据库操作,详情看下
基于数组的循环缓冲区包括并发无锁版本,带锁的并发版本和非线程安全版本UnitTests是一个可执行程序,带有一些功能,可以在Visual Studio中运行基本的单元测试。 还没有针对最新版本的测试。 (尝试使用NUnit。但是...
LockFreeHashMap-rs Rust的并发,无锁哈希映射。 这是Cliff Click博士创建的无锁哈希映射的实现。 点击发表的对他的哈希映射。 此外,“参考” Java代码可以及最近的。入门该板条箱可在上。 要在您的项目中使用此...
基于python实现的sqlite队列,方便的处理sqlite并发。SqliteQueue是继承了threading.Thread的线程,并且维护了一个向sqlite请求的队列。支持peewee请求。SqlQuery简单的封装了SQL语句
上述技术可用于实现完全无锁的基于数组的队列: lockfree queue primitivestypedef struct _queue_t *queue_t;queue_t queue_create(size_t);void *queue_dequeue(queue_t);int queue_enqueue(queue_t, void *);...