线程池---

老板-员工

队列操作---见进阶------数据结构(针对小白版)_线性表,树,图+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;
}