J'écris un code de base de producteur/consommateur. J'ai la plupart du temps pour fonctionner, mais j'ai un problème avec rand(). Ou peut-être mes problèmes sont plus profonds que rand(), et rand n'est que la pointe de l'iceberg. Je ne veux rien faire de trop complexe (pas de runnable ou d'attente).MultiThreading producteur/consommateur
J'ai un ensemble global d'entiers qui agit comme tampon. J'autorise l'utilisateur à saisir la taille et la limite des temps d'exécution. Je fais du compteur une variable globale statique. ceci est mon producteur:
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;
}
c'est mon 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;
}
en 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]);
}
Il génère seulement 1 à chaque fois. Srand ne travaillait pas non plus. Mais il fonctionne le nombre correct de fois.
EDIT --- Je fixe le producteur et le consommateur pour faire face à la condition de course:
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;
}
mais la chose au hasard garde toujours agir vers le haut. Il ne fait que produire un nombre encore et encore (même lorsqu'il est ensemencé).
Alors où est la synchronisation? – Mysticial
Si le consommateur court le premier sans rien, alors le producteur intervient, puis le consommateur reprend là où il s'était arrêté. Cela dépend de ce qui commence –
Vous avez une condition de course non protégée sur le tampon. C'est un comportement indéfini. – Mysticial