/// Test program that uses the QAtomicInt class. #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include "config.h" #include <QAtomicInt> // class QAtomicInt #include <cassert> #include <cstdio> // fprintf() #include <cstdlib> // atoi() #include <new> #include <pthread.h> // pthread_barrier_t #include <vector> static pthread_barrier_t s_barrier; static QAtomicInt* s_pAtomicInt; void* thread_func(void* pArg) { const int iArg = *reinterpret_cast<int*>(pArg); pthread_barrier_wait(&s_barrier); while (! s_pAtomicInt->testAndSetOrdered(iArg, iArg + 1)) ; return NULL; } int main(int argc, char** argv) { int i; const int n_threads = 10; std::vector<int> thread_arg(n_threads); std::vector<pthread_t> tid(n_threads); fprintf(stderr, "Start of test.\n"); pthread_barrier_init(&s_barrier, 0, n_threads); s_pAtomicInt = new QAtomicInt(); for (i = 0; i < n_threads; i++) { thread_arg[i] = i; pthread_create(&tid[i], 0, thread_func, &thread_arg[i]); } for (i = 0; i < n_threads; i++) { pthread_join(tid[i], NULL); } pthread_barrier_destroy(&s_barrier); if (*s_pAtomicInt == n_threads) fprintf(stderr, "Test successful.\n"); else fprintf(stderr, "Test failed: counter = %d, should be %d\n", static_cast<int>(*s_pAtomicInt), n_threads); delete s_pAtomicInt; s_pAtomicInt = 0; return 0; }