Initial Commit - Lesson 31 (Commit #1)

This commit is contained in:
Norman Lansing
2026-02-24 22:39:26 -05:00
commit 9591e7f503
4631 changed files with 1019212 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
// ©2013 Cameron Desrochers.
// Distributed under the simplified BSD license (see the LICENSE file that
// should have come with this file).
#include "model-checker/include/threads.h"
#include "corealgo.h"
void consumer(void* param)
{
int id = *(int*)param;
int& dequeueCount = *(int*)param;
dequeueCount = 0;
int last = 0;
int element;
bool success = try_dequeue(element);
if (success) {
MODEL_ASSERT(element > last);
last = element;
++dequeueCount;
}
success = try_dequeue(element);
if (success) {
MODEL_ASSERT(element > last);
last = element;
++dequeueCount;
}
}
void producer(void* param)
{
for (int i = 1; i <= 8; ++i)
enqueue(i);
consumer(param);
}
int user_main(int, char**)
{
init();
// Start out as thread IDs, but are re-used by the threads
// to indicate the number of elements each one dequeued
int w = 1, x = 2, y = 3, z = 4;
thrd_t a, b, c, d;
thrd_create(&a, &producer, &w);
thrd_create(&b, &consumer, &x);
thrd_create(&c, &consumer, &y);
thrd_create(&d, &consumer, &z);
thrd_join(a);
thrd_join(b);
thrd_join(c);
thrd_join(d);
MODEL_ASSERT(w + x + y + z + size_approx() == 8);
return 0;
}