- 论坛徽章:
- 0
|
本帖最后由 一刀。 于 2012-10-04 00:17 编辑
回复 20# 群雄逐鹿中原
在WIKI上看到一个用yield()实现的生产者/消费者模型。感觉很不错,所以单独提出来说,本质确实如你所说的的忙等待。- volatile unsigned int produceCount, consumeCount;
- TokenType buffer[BUFFER_SIZE];
-
- void producer(void) {
- while (1) {
- while (produceCount - consumeCount == BUFFER_SIZE)
- sched_yield(); // buffer is full
-
- buffer[produceCount % BUFFER_SIZE] = produceToken();
- produceCount += 1;
- }
- }
-
- void consumer(void) {
- while (1) {
- while (produceCount - consumeCount == 0)
- sched_yield(); // buffer is empty
-
- consumeToken( buffer[consumeCount % BUFFER_SIZE]);
- consumeCount += 1;
- }
- }
复制代码 补充:
用条件变量实现的生产者好像也可以理解为忙等- int queue_size = 100;
- int fill_count = 0;
- pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
- pthread_cond_t fill = PTHREAD_COND_INITIALIZER;
- pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
- void enqueue()
- {
- pthread_mutex_lock(&mutex);
- while(fill_count == queue_size)
- pthread_cond_wait(&empty, &mutex);
- /* enqueue */
- fill_count++;
- pthread_cond_broadcast(&fill);
- pthread_mutex_unlock(&mutex);
- }
- void dequeue()
- {
- pthread_mutex_lock(&mutex);
- while(fill_count == 0)
- pthread_cond_wait(&fill, &mutex);
- /* dequeue */
- fill_count--;
- pthread_cond_broadcast(&empty)
- pthread_cond_unlock(&mutex);
- }
复制代码 |
|