Exemplo n.º 1
0
        public void MultipleAcquiresSemaphoreTest()
        {
            const int ACQUIRES = 10;

            bool[]        acquires = new bool[ACQUIRES];
            Thread[]      threads  = new Thread[ACQUIRES];
            SafeSemaphore sem      = new SafeSemaphore(10, 10);

            for (int i = 0; i < ACQUIRES; ++i)
            {
                threads[i] = new Thread((idx) => {
                    bool res;
                    do
                    {
                        res = sem.TryAcquire(1);
                    }while (!res);
                    acquires[(int)idx] = true;
                });
                threads[i].Start(i);
            }

            // check if all threads terminate
            bool result = true;

            for (int i = 0; i < ACQUIRES; ++i)
            {
                bool partial = threads[i].Join(2000);
                if (!partial)
                {
                    TerminateThread(threads[i]);
                }
                result = result && partial;
            }
            if (!result)
            {
                Assert.Fail("One or more threads not terminated!");
            }

            // check if all results are true
            for (int i = 0; i < ACQUIRES; ++i)
            {
                if (!acquires[i])
                {
                    Assert.Fail("Unsuccessful acquire!");
                }
            }

            Assert.AreEqual(false, sem.TryAcquire(1));
        }
Exemplo n.º 2
0
        public void TwoAcquiresOnOnePermitsSemaphoreTest()
        {
            int    acquire1 = -1, acquire2 = -1;
            Thread t = new Thread(() => {
                SafeSemaphore sem = new SafeSemaphore(1, 1);

                acquire1 = sem.TryAcquire(1) ? 1 : 0;
                acquire2 = sem.TryAcquire(1) ? 1 : 0;
            });

            t.Start();

            bool done = t.Join(2000);

            if (!done)
            {
                TerminateThread(t);
                Assert.Fail();
            }
            Assert.AreEqual(1, acquire1);
            Assert.AreEqual(0, acquire2);
        }