-1
我在寫一個基本的生產者/消費者線程代碼。我得到了大部分的工作,但我有一個問題與蘭特()。或者,也許我的問題比rand()更深,而rand只是冰山一角。我不想做任何太複雜的事情(無法運行或等待)。多線程生產者/消費者
我有一個全局的整數作爲緩衝區。我允許用戶輸入大小和運行時間的限制。 我讓計數器成爲一個靜態全局變量。 這是我的製片人:
DWORD WINAPI producer(LPVOID n)
{
cout << "\nPRODUCER:The producer is running right now" << endl;
int size = (int)n;
int num = rand()%10;// this is for making item.
while (buffer.size() > size)
{
}
buffer.push_back(num);
counter++;
return (DWORD)n;
}
這是我consumer--
DWORD WINAPI consumer(LPVOID n)
{
cout << "\nCONSUMER:The consumer is running right now" << endl;
while (buffer.empty())
{ }
int item= buffer.front();
cout << "\nCONSUMER:The consumer ate" << item << endl;
counter++;
return (DWORD)n;
}
在main-
while (counter < l)
{
hThreads[0] = CreateThread(NULL, 0, producer, (LPVOID)s, NULL, &id[0]);
hThreads[1] = CreateThread(NULL, 0, consumer, (LPVOID)l, NULL, &id[1]);
waiter = WaitForMultipleObjects(MAX_THREADS, hThreads, TRUE, INFINITE);
}
for (int i = 0; i < MAX_THREADS; i++) {
CloseHandle(hThreads[i]);
}
所以每次只產生1個。 Srand也沒有工作。但它運行正確的次數。
編輯--- 所以我固定的生產和消費,以應對競爭條件:
DWORD WINAPI producer(LPVOID s)
{
WaitForSingleObject(Empty, INFINITE);
WaitForSingleObject(Mutex, INFINITE);
cout << "\nPRODUCER...." << endl;
int size = (int)s;
srand(size);
int in = rand() % 10;
cout << "THIS IS IN:::" << in << endl;
while (buffer.size() == size)
{
ReleaseMutex(Mutex);
}
buffer.push_back(in);
counter++;
cout << "\nThe producer produces " << buffer.front() << endl;
ReleaseMutex(Mutex);
ReleaseSemaphore(Full, 1, NULL);
return (DWORD)s;
}
DWORD WINAPI consumer(LPVOID l)
{
WaitForSingleObject(Full, INFINITE);
WaitForSingleObject(Mutex, INFINITE);
cout << "\nCONSUMER...." << endl;
while (buffer.empty())
{
ReleaseMutex(Mutex);
}
int out = buffer.front();
counter++;
ReleaseMutex(Mutex);
ReleaseSemaphore(Empty, 1, NULL);
return (DWORD)l;
}
但隨意的事情仍保持演戲了。它只會一直重複生成一個數字(即使播種時也是如此)。
那麼同步在哪裏呢? – Mysticial
如果消費者沒有任何東西先運行,那麼生產者就會進入,然後消費者就會從中斷。這取決於首先啓動哪個 –
緩衝區上存在未受保護的競爭條件。這是未定義的行爲。 – Mysticial