11
11
#include <unistd.h>
12
12
13
13
#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 ;
14
17
15
18
struct ll_param {
16
19
struct kfifo * fifo ;
@@ -25,23 +28,30 @@ void thread_reader(void *param)
25
28
unsigned int counter = 0 ;
26
29
unsigned char buffer [FIFO_LENGTH ];
27
30
struct ll_param * p = (struct ll_param * )param ;
31
+ unsigned int klen = 0 ;
28
32
29
33
printf ("nnn = %d\n" , (int )roundup_pow_of_two (5 ));
30
34
31
35
for (;;) {
36
+ klen = kfifo_len (p -> fifo );
37
+ if (klen <= 0 ) {
38
+ pthread_cond_wait (& q_not_empty , & qlock );
39
+ }
40
+
32
41
bzero (buffer , FIFO_LENGTH );
33
42
read_len = kfifo_get (p -> fifo , buffer , 32 );
34
43
if (read_len != 0 ) {
35
44
printf ("Read len:%d, buffer is :< %s >n\n" , read_len ,
36
45
buffer );
37
46
} else {
38
47
counter ++ ;
48
+ if (counter > 2 ) {
49
+ break ;
50
+ }
39
51
}
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 );
45
55
}
46
56
}
47
57
@@ -51,11 +61,20 @@ void thread_writer(void *param)
51
61
unsigned int counter = 0 ;
52
62
unsigned char buffer [32 ];
53
63
struct ll_param * p = (struct ll_param * )param ;
64
+ unsigned int klen = 0 ;
54
65
55
66
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
+
56
73
bzero (buffer , 32 );
57
74
sprintf ((char * )buffer , "This is %d message.n" , counter );
58
75
kfifo_put (p -> fifo , buffer , 32 ); //strlen((char *)buffer)
76
+
77
+ pthread_cond_signal (& q_not_empty );
59
78
// usleep(100);
60
79
}
61
80
}
0 commit comments