windows下 c 實現(xiàn)生產(chǎn)者消費者問題

#include <stdio.h>
#include <windows.h>

#define P(S) WaitForSingleObject(S, INFINITE) //定義Windows下的P操作
#define V(S) ReleaseSemaphore(S, 1, NULL)     //定義Windows下的V操作

//生產(chǎn)者 消費者 緩沖區(qū)
#define num_of_productors 2
#define num_of_consumers 3
#define num_of_buffers 3

int nextp = 1;                      //下一個產(chǎn)品的編號
int in = 0, out = 0;                //分別指向下一個存放產(chǎn)品和取出產(chǎn)品的緩沖區(qū)編號
int g_Buffer[num_of_buffers] = {0}; //緩沖區(qū)初始值為空

HANDLE g_hSemaphoreEmpty, g_hSemaphoreFull, g_hMutex;

//生產(chǎn)者線程函數(shù)
DWORD WINAPI ProducerThreadFun(LPVOID pM)
{
  Sleep(100);
  do
  {
    int id = *((int *)(pM)); //生產(chǎn)者編號
    P(g_hSemaphoreEmpty);
    P(g_hMutex);
    g_Buffer[in] = nextp;
    printf("生產(chǎn)者%d將數(shù)據(jù)%d放入緩沖區(qū)%d\n", id, nextp, in);
    nextp++;
    in = (in + 1) % num_of_buffers;
    V(g_hMutex);
    V(g_hSemaphoreFull);
    Sleep(100);
    if (nextp > 12)
      break;
  } while (true);
  return 0;
}
//消費者線程函數(shù)
DWORD WINAPI ConsumerThreadFun(LPVOID pM)
{
  Sleep(100);
  do
  {
    int id = *((int *)(pM)); //消費者編號
    P(g_hSemaphoreFull);
    P(g_hMutex);
    //nextp = g_Buffer[out];
    printf(" 消費者%d從緩沖區(qū)%d中取數(shù)據(jù)%d\n", id, out, g_Buffer[out]);
    out = (out + 1) % num_of_buffers;
    V(g_hMutex);
    V(g_hSemaphoreEmpty);
    Sleep(100);
  } while (true);
}
int main()
{
  int num[num_of_productors + num_of_consumers];
  printf(" 生產(chǎn)者消費者問題:%d生產(chǎn)者 %d消費者 %d緩沖區(qū)\n", num_of_productors, num_of_consumers, num_of_buffers);
  //初始值為num_of_buffers的信號量
  g_hSemaphoreEmpty = CreateSemaphore(NULL, num_of_buffers, num_of_buffers, NULL); //繼承/初始化信號計數(shù)/最大信號計數(shù)/名稱
  //初始值為0的信號量
  g_hSemaphoreFull = CreateSemaphore(NULL, 0, num_of_buffers, NULL);
  //互斥量
  g_hMutex = CreateSemaphore(NULL, 1, 1, NULL);

  const int THREADNUM = num_of_productors + num_of_consumers; //線程數(shù)
  HANDLE hThread[THREADNUM];

  for (int i = 0; i < num_of_productors; i++) //創(chuàng)建生產(chǎn)者線程
  {
    num[i] = i + 1;
    hThread[i] = CreateThread(NULL, 0, ProducerThreadFun, (LPVOID *)&num[i], 0, NULL);
  }                                                                              //繼承/初始棧大小/線程函數(shù)/向線程函數(shù)傳遞的參數(shù)/線程標(biāo)志 0 表示創(chuàng)建后立即激活/保存新線程的ID
  for (int i = num_of_productors; i < num_of_productors + num_of_consumers; i++) //創(chuàng)建消費者者線程
  {
    num[i] = i - num_of_productors + 1;
    hThread[i] = CreateThread(NULL, 0, ConsumerThreadFun, (LPVOID *)&num[i], 0, NULL);
  }

  WaitForMultipleObjects(THREADNUM, hThread, TRUE, INFINITE);

  system("pause");
  return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容