Mar*_* L. 0 c nonblocking circular-buffer blocking
我在用户空间中搜索C中的ringbuffer实现,所以我可以在我的库中使用它.
因为我需要一个铃声缓冲器
我搜索了一段时间,并记得我在内核模式中使用wait_event_interruptible&wake_up_interruptible做了类似的事情.
但是在用户空间中使用了什么,所以我可以搜索与该方法结合的ringbuffer?我不想重新发明轮子 - 周围有许多环形缓冲解决方案.
在此先感谢并亲切的问候!
编辑:
似乎也许pthread_cond_wait可能相当于wait_event_interruptible.
添加一些代码的另一个答案,在我的另一个答案中不是1:1匹配pseudocde.将此标记为维基答案,以防有人想要添加评论或进行其他改进.C phtread互斥+条件变量实现非常简单的ringbuffer:
#include <stdio.h>
#include <pthread.h>
#define RINGBUFFER_SIZE (5)
int ringbuffer[RINGBUFFER_SIZE];
unsigned reader_unread = 0;
unsigned writer_next = 0;
pthread_mutex_t ringbuffer_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t ringbuffer_written_cond = PTHREAD_COND_INITIALIZER;
void process_code(int ch) {
int counter;
printf("Processing code %d", ch);
for(counter=5; counter>0; --counter) {
putchar('.');
fflush(stdout);
sleep(1);
}
printf("done.\n");
}
void *reader() {
pthread_mutex_lock(&ringbuffer_mutex);
for(;;) {
if (reader_unread == 0) {
pthread_cond_wait(&ringbuffer_written_cond, &ringbuffer_mutex);
}
if (reader_unread > 0) {
int ch;
int pos = writer_next - reader_unread;
if (pos < 0) pos += RINGBUFFER_SIZE;
ch = ringbuffer[pos];
--reader_unread;
if (ch == EOF) break;
pthread_mutex_unlock(&ringbuffer_mutex);
process_code(ch);
pthread_mutex_lock(&ringbuffer_mutex);
}
}
pthread_mutex_unlock(&ringbuffer_mutex);
puts("READER THREAD GOT EOF");
return NULL;
}
void *writer() {
int ch;
do {
int overflow = 0;
ch = getchar();
pthread_mutex_lock(&ringbuffer_mutex);
ringbuffer[writer_next] = ch;
++writer_next;
if (writer_next == RINGBUFFER_SIZE) writer_next = 0;
if (reader_unread < RINGBUFFER_SIZE) ++reader_unread;
else overflow = 1;
pthread_cond_signal(&ringbuffer_written_cond);
pthread_mutex_unlock(&ringbuffer_mutex);
if (overflow) puts("WARNING: OVERFLOW!");
} while(ch != EOF);
puts("WRITER THREAD GOT EOF");
return NULL;
}
int main(void)
{
pthread_t reader_thread, writer_thread;
puts("Starting threads. Type text and press enter, or type ctrl-d at empty line to quit.");
pthread_create(&reader_thread, NULL, reader, NULL);
pthread_create(&writer_thread, NULL, writer, NULL);
pthread_join(writer_thread, NULL);
pthread_join(reader_thread, NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5592 次 |
| 最近记录: |