首页 > 代码库 > 一个失败的生产者,消费者代码
一个失败的生产者,消费者代码
下面是本人前不久刚挖出来的坑,热呼呼的还冒着气。
谁能发现坑在哪?
背景:
thread_main 函数:负责accept socket ,然后分发给worker thread。
thread_worker函数:负责消耗掉main thread 传递过来的线程。
关系图:
结构体设计:
struct thread_pool { pthread_mutex_t mutex; pthread_cond_t cond; pthread_t tids[MAX_THREADS]; int connfd; int ready; void (*process)(int s); };
thread_main 函数实现:
static void thread_main(struct thread_pool *pool, int s) { int connfd; for (;;) { /*get client sock*/ connfd = accept(s, NULL, NULL); fprintf(stderr, "current sock = %d\n", connfd); if (connfd == -1) { perror("accept"); break; } pthread_mutex_lock(&pool->mutex); printf("main: ready = %d\n", pool->ready); while (pool->ready == 1) { pthread_cond_wait(&pool->cond, &pool->mutex); } pool->connfd = connfd; pool->ready = 1; pthread_cond_signal(&pool->cond); pthread_mutex_unlock(&pool->mutex); } }
thread_worker 函数实现:
static void *thread_worker(void *arg) { struct thread_pool *p = (struct thread_pool *)arg; int connfd = -1; for (;;) { pthread_mutex_lock(&p->mutex); while (p->ready == 0) { pthread_cond_wait(&p->cond, &p->mutex); } connfd = p->connfd; p->ready = 0; printf("ready = %d\n", p->ready); pthread_mutex_unlock(&p->mutex); p->process(connfd); } return (void *)0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。