mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 14:16:07 -06:00
57 lines
1,011 B
C++
57 lines
1,011 B
C++
#include <Core/Core.h>
|
|
|
|
#ifdef _DEBUG
|
|
#define N 1000
|
|
#else
|
|
#define N 1000 * 100
|
|
#endif
|
|
|
|
#define THREADS 5
|
|
|
|
using namespace Upp;
|
|
|
|
Mutex mutex;
|
|
Semaphore todo;
|
|
BiVector<int *> queue;
|
|
|
|
void ProducerThread()
|
|
{
|
|
for(int i = 0; i < N; i++) {
|
|
mutex.Enter();
|
|
queue.AddHead() = new int;
|
|
mutex.Leave();
|
|
todo.Release();
|
|
}
|
|
}
|
|
|
|
void ConsumerThread()
|
|
{
|
|
for(;;) {
|
|
todo.Wait();
|
|
Mutex::Lock __(mutex);
|
|
if(queue.GetCount()) {
|
|
int *ptr = queue.Tail();
|
|
if(!ptr) break;
|
|
queue.DropTail();
|
|
delete ptr;
|
|
}
|
|
}
|
|
}
|
|
|
|
CONSOLE_APP_MAIN {
|
|
Thread producer[THREADS];
|
|
Thread consumer[THREADS];
|
|
for(int i = 0; i < THREADS; i++) {
|
|
producer[i].Run(callback(ProducerThread));
|
|
consumer[i].Run(callback(ConsumerThread));
|
|
}
|
|
for(int i = 0; i < THREADS; i++)
|
|
producer[i].Wait();
|
|
mutex.Enter();
|
|
queue.AddHead(NULL);
|
|
mutex.Leave();
|
|
for(int i = 0; i < THREADS; i++)
|
|
todo.Release();
|
|
for(int i = 0; i < THREADS; i++)
|
|
consumer[i].Wait();
|
|
}
|