8000 加入了线程的条件控制,方便的休眠一个线程,知道条件满足 buffer可写或者可读了,另外一个就是为了体现缓冲区的意义,特意将速度快的写线程… · home-coder/ring-buffer@f3abce3 · GitHub
[go: up one dir, main page]

Skip to content

Commit f3abce3

Browse files
committed
加入了线程的条件控制,方便的休眠一个线程,知道条件满足 buffer可写或者可读了,另外一个就是为了体现缓冲区的意义,特意将速度快的写线程在条件为缓冲区满了的时候让线程休眠5秒钟,腾出cpu。
1 parent 572b56a commit f3abce3

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

test

-8.98 KB
Binary file not shown.

test.c

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
#include <unistd.h>
1212

1313
#define FIFO_LENGTH 4096
14+
pthread_cond_t q_not_full = PTHREAD_COND_INITIALIZER;
15+
pthread_cond_t q_not_empty = PTHREAD_COND_INITIALIZER;
16+
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
1417

1518
struct ll_param {
1619
struct kfifo *fifo;
@@ -25,23 +28,30 @@ void thread_reader(void *param)
2528
unsigned int counter = 0;
2629
unsigned char buffer[FIFO_LENGTH];
2730
struct ll_param *p = (struct ll_param *)param;
31+
unsigned int klen = 0;
2832

2933
printf("nnn = %d\n", (int)roundup_pow_of_two(5));
3034

3135
for (;;) {
36+
klen = kfifo_len(p->fifo);
37+
if (klen <= 0) {
38+
pthread_cond_wait(&q_not_empty, &qlock);
39+
}
40+
3241
bzero(buffer, FIFO_LENGTH);
3342
read_len = kfifo_get(p->fifo, buffer, 32);
3443
if (read_len != 0) {
3544
printf("Read len:%d, buffer is :< %s >n\n", read_len,
3645
buffer);
3746
} else {
3847
counter++;
48+
if (counter > 2) {
49+
break;
50+
}
3951
}
40-
if (counter > 20) {
41-
//break;
42-
}
43-
sleep(1);
44-
//usleep(50000);
52+
pthread_cond_signal(&q_not_full);
53+
//sleep(1);
54+
usleep(100000);
4555
}
4656
}
4757

@@ -51,11 +61,20 @@ void thread_writer(void *param)
5161
unsigned int counter = 0;
5262
unsigned char buffer[32];
5363
struct ll_param *p = (struct ll_param *)param;
64+
unsigned int klen = 0;
5465

5566
for (counter = 0; counter < 2000; counter++) {
67+
klen = kfifo_len(p->fifo);
68+
if (klen >= FIFO_LENGTH) {
69+
sleep(5);
70+
pthread_cond_wait(&q_not_full, &qlock);
71+
}
72+
5673
bzero(buffer, 32);
5774
sprintf((char *)buffer, "This is %d message.n", counter);
5875
kfifo_put(p->fifo, buffer, 32); //strlen((char *)buffer)
76+
77+
pthread_cond_signal(&q_not_empty);
5978
// usleep(100);
6079
}
6180
}

0 commit comments

Comments
 (0)
0