Esempio n. 1
0
int main() {
    for (int i = 0; i < READER_COUNT; ++i) {
        createThread([&](){
                g_mainWaiter.release();
                g_threadsWaiter.wait();

                double start = getTime();
                for (int j = 0; j < READER_LOOP; ++j) {
                    {
#if USE_LOCK == LOCK_TYPE_RW
                        ReaderGuard<ReaderWriterLock> guard(g_resRW);
#elif USE_LOCK == LOCK_TYPE_RW2
                        ReaderGuard<ReaderWriterLock2> guard(g_resRW2);
#elif USE_LOCK == LOCK_TYPE_POSIX_RW
                        ReaderGuard<PosixReaderWriterLock> guard(g_posixResRW);
#elif USE_LOCK == LOCK_TYPE_MUTEX
                        MutexGuard<Mutex> guard(g_resMutex);
#elif USE_LOCK == LOCK_TYPE_POSIX_MUTEX
                        MutexGuard<PosixMutex> guard(g_posixResMutex);
#else
#endif
                        doRead();
                    }
                }
                double readerTime = getTime() - start;

                MutexGuard<Mutex> guard(g_gMutex);
                g_readerTime += readerTime;
                g_mainWaiter.release();
                });
    }
    for (int i = 0; i < WRITER_COUNT; ++i) {
        createThread([&](){
                g_mainWaiter.release();
                g_threadsWaiter.wait();

                double start = getTime();
                for (int j = 0; j < WRITER_LOOP; ++j) {
                    sleep_us(10);
                    {
#if USE_LOCK == LOCK_TYPE_RW
                        WriterGuard<ReaderWriterLock> guard(g_resRW);
#elif USE_LOCK == LOCK_TYPE_RW2
                        WriterGuard<ReaderWriterLock2> guard(g_resRW2);
#elif USE_LOCK == LOCK_TYPE_POSIX_RW
                        WriterGuard<PosixReaderWriterLock> guard(g_posixResRW);
#elif USE_LOCK == LOCK_TYPE_MUTEX
                        MutexGuard<Mutex> guard(g_resMutex);
#elif USE_LOCK == LOCK_TYPE_POSIX_MUTEX
                        MutexGuard<PosixMutex> guard(g_posixResMutex);
#else
#endif
                        doWrite();
                    }
                }
                double writerTime = getTime() - start;

                MutexGuard<Mutex> guard(g_gMutex);
                g_writerTime += writerTime;
                g_mainWaiter.release();
                });
    }

    for (int i = 0; i < READER_COUNT + WRITER_COUNT; ++i) g_mainWaiter.acquire();
    g_threadsWaiter.signal();
    for (int i = 0; i < READER_COUNT + WRITER_COUNT; ++i) g_mainWaiter.acquire();

    fprintf(stderr, "res=%d,res2=%d=\n", g_res, g_res2);
    printf("lockType=%s, R/W=%d, reader=%.3fs, writer=%.3fs\n", TYPE_NAME, READER_COUNT / WRITER_COUNT, g_readerTime / READER_COUNT, g_writerTime / WRITER_COUNT);
}