#include #include #include #include #include #define THREADS_NUM 1000 #define MUTEX_LOCKS 300000 static pthread_mutex_t mutex; static pthread_mutex_t thread_start_mutex; static int dummy_count; typedef struct { volatile int val; } atomic_t; atomic_t contended = { 0 }; static inline int atomic_inc(atomic_t *addr) { return __sync_add_and_fetch(&addr->val, 1); } static void *run_thread(void *arg) { int i; pthread_mutex_lock(&thread_start_mutex); pthread_mutex_unlock(&thread_start_mutex); for (i = 0; i < MUTEX_LOCKS; i++) { if (pthread_mutex_trylock(&mutex) == EBUSY) { pthread_mutex_lock(&mutex); atomic_inc(&contended); } dummy_count++; pthread_mutex_unlock(&mutex); } return NULL; } int main(int argc, char *argv[]) { pthread_t thread[THREADS_NUM]; pthread_attr_t thread_attr; int i; pthread_mutex_init(&mutex, NULL); pthread_mutex_init(&thread_start_mutex, NULL); pthread_attr_init(&thread_attr); pthread_attr_setstacksize(&thread_attr, 32*1024); pthread_mutex_lock(&thread_start_mutex); for (i = 0; i < THREADS_NUM; i++) { if (pthread_create(&thread[i], &thread_attr, run_thread, NULL) != 0) { printf("Thread[%d] create failed:", i); perror(NULL); exit(-1); } } pthread_mutex_unlock(&thread_start_mutex); for (i = 0; i < THREADS_NUM; i++) { if (pthread_join(thread[i], NULL) != 0) printf("Thread #%d join failed.\n", i); } pthread_mutex_destroy(&mutex); pthread_mutex_destroy(&thread_start_mutex); printf("contended:%d\n", contended.val); return 0; }