2013-05-08 39 views
0
// windows_procon.cpp : Defines the entry point for the console application. 

#include "stdafx.h" 
#include <stdlib.h> 
#include <iostream> 
#include <time.h> 
#include <windows.h> 
#include <process.h> 
using namespace std; 

HANDLE mutex; 
HANDLE emptySlots; 
HANDLE filledSlots; 

#define BUFFER_SIZE 10 

void *producer(void *); 
void *consumer(void *); 
int produceItem(void); 
void printBuffer(void); 

int buffer[BUFFER_SIZE]; 
int head = 0; 
int tail = 0; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DWORD prodThrdID, consThrdID; 

    mutex = CreateMutex(NULL,FALSE,NULL); 
    emptySlots = CreateSemaphore(NULL,BUFFER_SIZE,BUFFER_SIZE,NULL); 
    filledSlots = CreateSemaphore(NULL,0,0,NULL); 

    srand(time(NULL)); 

    _beginthreadex(NULL, 0, (unsigned int(__stdcall *)(void*))producer, 
        0, 0, (unsigned int *)&prodThrdID); 
    _beginthreadex(NULL, 0, (unsigned int(__stdcall *)(void*))consumer, 
        0, 0, (unsigned int *)&consThrdID); 

    return 0; 
} 

void *producer(void *n) 
{ 
    int item; 
    for(int i = 0; i <BUFFER_SIZE+5; i++) 
    { 
     WaitForSingleObject(emptySlots,INFINITE); 
     WaitForSingleObject(mutex,INFINITE); 

     item = produceItem(); 
     //printf("Producing"); 

     cout << "Producing: " << item << endl; 
     //logfile << "Producing: "<< item << endl; 
     //fprintf(logfile, "Producing: %d \n", item); 
     buffer[head] = item; 
     head = (head + 1) % BUFFER_SIZE; 
     printBuffer(); 

     ReleaseMutex(mutex); 
     ReleaseSemaphore(filledSlots,1, NULL); 
    } 
    return n; 
} 

void *consumer(void *n) 
{ 
    for(int i = 0; i <BUFFER_SIZE+5; i++) 
    { 
     WaitForSingleObject(filledSlots,INFINITE); 
     //Sleep(500); 
     WaitForSingleObject(mutex,INFINITE); 

     cout << "Consuming: " << buffer[tail] << endl; 

     buffer[tail] = 0; 
     tail = (tail + 1) % BUFFER_SIZE; 
     printBuffer(); 

     ReleaseMutex(mutex); 
     ReleaseSemaphore(emptySlots,1, NULL); 
    } 
    return n; 
} 

int produceItem(void) 
{ 
    int x = (rand()%11 + 1); 
    return x; 
} 

void printBuffer(void) 
{ 
    for(int i = 0; i <BUFFER_SIZE; i++) 
    { 
     printf("%d ", buffer[i]); 
    } 
    printf("END \n"); 
} 

我的程序在这里应该是一个生产者 - 消费者问题的算法。我认为我的算法正确,我唯一的问题是我无法让线程正常运行。有人能告诉我这是什么问题吗?为什么我的线程不能运行?

回答

1

您需要等待您使用_beginthreadex创建的线程完成他们的工作,因为它代表您创建程序后立即退出。我没有进一步看你的逻辑。

这里是一个例子。

hThread = (HANDLE)_beginthreadex(NULL, 0, &SecondThreadFunc, NULL, 0, &threadID); 
WaitForSingleObject(hThread, INFINITE); 
+0

我该如何等待它们?我很困惑我使用WaitForSingleObject吗? – user2134127 2013-05-09 00:10:21

相关问题