注释下段代码void init(struct prodcons * b) { pthread_mutex_init(&b->lock, NULL); pthread_cond_init(&b->notempty, NULL); pthread_cond_init(&b->notfull, NULL); b->readpos = 0; b->writepos = 0; } /*--------------------------------------------------------*/ /* 向缓冲区中写入一个整数*/ void put(struct prodcons * b, int data) { pthread_mutex_lock(&b->lock); /*等待缓冲区非满*/ if (b->writepos == 0){ printf("第十七个数,wait for not full\n"); pthread_cond_signal(&b->notempty); pthread_cond_wait(&b->notfull,&b->lock); } /*写数据并且指针前移*/ b->buffer[b->writepos] = data; b->writepos++; if (b->writepos >= BUFFER_SIZE) b->writepos = 0; /*设置缓冲区非空信号*/ pthread_mutex_unlock(&b->lock); if (data == -1){ printf("最后,生产任务结束\n"); pthread_cond_signal(&b->notempty); } } /*--------------------------------------------------------*/ /*从缓冲区中读出一个整数 */ int get(struct prodcons * b) { int data; pthread_mutex_lock(&b->lock); /* 等待缓冲区非空*/ if (0 == b->readpos){ pthread_cond_signal(&b->notfull); pthread_cond_wait(&b->notempty,&b->lock); printf("wait for not empty\n"); } /* 读数据并且指针前移 */ data = b->buffer[b->readpos]; b->readpos++; if (b->readpos >= (BUFFER_SIZE)) b->readpos = 0; /* 设置缓冲区非满信号*/ pthread_mutex_unlock(&b->lock); return data; }
时间: 2024-02-19 07:01:28 浏览: 63
linux创建线程之pthread_create的具体使用
这段代码实现了一个生产者-消费者模型的缓冲区。其中,init() 函数用于初始化缓冲区,包括初始化互斥锁和条件变量,以及设置读写指针的初始值。put() 函数用于向缓冲区中写入一个整数,它首先获取互斥锁,然后判断缓冲区是否已满,如果已满则等待条件变量 notfull 的信号,直到被唤醒后再次检查缓冲区是否已满,否则写入数据并将写指针前移。最后释放互斥锁并发送 notempty 信号,以通知消费者缓冲区非空。get() 函数用于从缓冲区中读出一个整数,它首先获取互斥锁,然后判断缓冲区是否为空,如果为空则等待条件变量 notempty 的信号,直到被唤醒后再次检查缓冲区是否为空,否则读取数据并将读指针前移。最后释放互斥锁并发送 notfull 信号,以通知生产者缓冲区非满。需要注意的是,该缓冲区的实现是线程安全的,即多个线程可以同时读写缓冲区而不会出现数据竞争问题。
阅读全文