gpt4 book ai didi

C - 带 pthreads 的循环字符缓冲区

转载 作者:太空宇宙 更新时间:2023-11-04 04:05:31 24 4
gpt4 key购买 nike

我有一个家庭作业,我必须实现一个循环缓冲区并使用单独的线程添加和删除字符:

#include <pthread.h>
#include <stdio.h>

#define QSIZE 10

pthread_cond_t full,/* count == QSIZE */
empty,/* count == 0 */
ready;
pthread_mutex_t m, n; /* implements critical section */
unsigned int iBuf, /* tail of circular queue */
oBuf; /* head of circular queue */
int count; /* count characters */
char buf [QSIZE]; /* the circular queue */

void Put(char s[]) {/* add "ch"; wait if full */
pthread_mutex_lock(&m);
int size = sizeof(s)/sizeof(char);
printf("size: %d", size);

int i;
for(i = 0; i < size; i++) {
while (count >= QSIZE)
pthread_cond_wait(&full, &m);/* is there empty slot? */

buf[iBuf] = s[i]; /* store the character */
iBuf = (iBuf+1) % QSIZE; /* increment mod QSIZE */
count++;
if (count == 1)
pthread_cond_signal(&empty);/* new character available */
}
pthread_mutex_unlock(&m);
}
char Get() {/* remove "ch" from queue; wait if empty */
char ch;

pthread_mutex_lock(&m);
while (count <= 0)
pthread_cond_wait(&empty, &m);/* is a character present? */

ch = buf[oBuf]; /* retrieve from the head of the queue */
oBuf = (oBuf+1) % QSIZE;
count--;
if (count == QSIZE-1)
pthread_cond_signal(&full);/* signal existence of a slot */

pthread_mutex_unlock(&m);
return ch;
}

void * p1(void *arg) {
int i;
for (i = 0; i < 5; i++) {
Put("hella");
}
}

void * p2(void *arg) {
int i;
for (i = 0; i < 5; i++) {
Put("goodby");
}
}

int main() {
pthread_t t1, t2;
void *r1, *r2;
oBuf = 0; iBuf = 0; count=0; /* all slots are empty */

pthread_cond_init(&full, NULL);
pthread_cond_init(&empty, NULL);
pthread_mutex_init(&m, NULL);

pthread_create(&t1, NULL, p1, &r1);
pthread_create(&t2, NULL, p2, &r2);

printf("Main");
char c;
int i = 0;
while (i < 55) {
c = Get();
printf("%c",c);
i++;
}

pthread_join(t1, &r1);
pthread_join(t2, &r2);
return 0;
}

我根本不需要对逻辑进行太多更改,要求非常具体。我认为我的问题在于 Put() 方法。我认为第一个线程正在进入并阻塞关键部分并导致死锁。我在想我应该做一个调度属性?当然我可能是错的。我对 pthreads 和并发编程还很陌生,所以我真的需要一些帮助来发现我的错误。

最佳答案

解决这个问题的一种方法是使用单独的互斥体来管理循环队列的头部和尾部。这样,由于缓冲区已满而阻塞的编写器不会阻塞读取器。

另一种解决方案是,如果遇到缓冲区已满或为空的情况,则释放互斥量,并在情况清除时重新获取。

-楼

关于C - 带 pthreads 的循环字符缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6487470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com