您的位置:首页 > 其它

一个线程间同步 + FIFO顺序操作链表的例子

2016-02-04 17:43 423 查看
如题:

生产者和消费者访问链表的顺序是FIFO,创建两个线程来操作这些数据:

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

struct msg {
struct msg *next;
int num;
};

struct msg *head;
struct msg *end;
struct msg *tmp;
pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void *consumer(void *p)
{
struct msg *mp;

for (;;) {
pthread_mutex_lock(&lock);
while (head == NULL)
pthread_cond_wait(&has_product, &lock);
mp = head;
head = mp->next;
pthread_mutex_unlock(&lock);
printf("Consume %d\n", mp->num);
free(mp);
sleep(rand() % 3);
}
}

void *producer(void *p)
{
struct msg *mp;
for (;;) {
mp = malloc(sizeof(struct msg));
mp->num = rand() % 1000 + 1;
printf("Produce %d\n", mp->num);
pthread_mutex_lock(&lock);
if (head == NULL)
head = mp;
else
end->next = mp;
end = mp;
end->next = NULL;
pthread_mutex_unlock(&lock);
//Queueprint();
pthread_cond_signal(&has_product);
sleep(rand() % 3);
}
}

int main(int argc, char *argv[])
{
pthread_t pid, cid;

srand(time(NULL));
pthread_create(&pid, NULL, producer, NULL);
pthread_create(&cid, NULL, consumer, NULL);
pthread_join(pid, NULL);
pthread_join(cid, NULL);
return 0;
}

输出:

$ gcc test.c -o test
$ ./test
Produce 934
Consume 934
Produce 263
Produce 701
Consume 263
Produce 753
Consume 701
Produce 257
Produce 712
Consume 753
Produce 844
Consume 257
Consume 712
Consume 844
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: