老板-员工
队列操作---见进阶------数据结构(针对小白版)_线性表,树,图+1对1,1对n,n对n-CSDN博客
核心代码
cpp
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "seqque.h"
sem_t sem_task;
pthread_mutex_t mutex;
TASK task_array[5] = {{"cooking...", 5},
{"washing...", 8},
{"study...", 4},
{"playing...", 2},
{"over", 3}};
void* th(void* arg)
{
SeqQueue* sq = (SeqQueue*)arg;
DATATYPE data;
while (1)
{
sem_wait(&sem_task);
pthread_mutex_lock(&mutex);
DATATYPE* ret = GetHeadSeqQue(sq);
memcpy(&data, ret, sizeof(DATATYPE));
QuitSeqQueue(sq);
pthread_mutex_unlock(&mutex);
if (0 == strcmp("over", data.task_name))
{
break;
}
while (data.test_time--)
{
printf("i'm %s\n", data.task_name);
sleep(1);
}
}
return NULL;
}
int main(int argc, char** argv)
{
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d %s %d\n", i, task_array[i].task_name, task_array[i].test_time);
}
pthread_t tid;
SeqQueue* sq = CreateSeqQueue(10);
sem_init(&sem_task, 0, 0);
pthread_mutex_init(&mutex, NULL);
pthread_create(&tid, NULL, th, sq);
while (1)
{
char buf[5] = {0};
DATATYPE data;
bzero(&data, sizeof(data));
fgets(buf, sizeof(buf), stdin);
int num = atoi(buf);
strcpy(data.task_name, task_array[num].task_name);
data.test_time = task_array[num].test_time;
pthread_mutex_lock(&mutex);
EnterSeqQueue(sq, &data);
pthread_mutex_unlock(&mutex);
sem_post(&sem_task);
if (0 == strcmp("over", task_array[num].task_name))
{
break;
}
}
pthread_join(tid, NULL);
sem_destroy(&sem_task);
pthread_mutex_destroy(&mutex);
DestroySeqQueue(sq);
// system("pause");
return 0;
}