#include <pthread.h>
#include <stdio.h>
+#include <string.h> // strerror()
+
+
+#define PTH_CALL(expr) \
+ do \
+ { \
+ int err = (expr); \
+ if ((err) != 0) \
+ { \
+ fprintf(stderr, \
+ "%s:%d %s returned error code %d (%s)\n", \
+ __FILE__, \
+ __LINE__, \
+ #expr, \
+ err, \
+ strerror(err)); \
+ } \
+ } while (0)
static pthread_rwlock_t s_rwlock;
static int s_counter;
+
static void* thread_func(void* arg)
{
int i;
for (i = 0; i < 1000; i++)
{
- pthread_rwlock_rdlock(&s_rwlock);
+ PTH_CALL(pthread_rwlock_rdlock(&s_rwlock));
sum += s_counter;
- pthread_rwlock_unlock(&s_rwlock);
- pthread_rwlock_wrlock(&s_rwlock);
+ PTH_CALL(pthread_rwlock_unlock(&s_rwlock));
+ PTH_CALL(pthread_rwlock_wrlock(&s_rwlock));
s_counter++;
- pthread_rwlock_unlock(&s_rwlock);
+ PTH_CALL(pthread_rwlock_unlock(&s_rwlock));
}
return 0;
pthread_t tid[thread_count];
int i;
- pthread_rwlock_init(&s_rwlock, NULL);
+ PTH_CALL(pthread_rwlock_init(&s_rwlock, NULL));
for (i = 0; i < thread_count; i++)
{
- pthread_create(&tid[i], 0, thread_func, 0);
+ PTH_CALL(pthread_create(&tid[i], 0, thread_func, 0));
}
for (i = 0; i < thread_count; i++)
{
- pthread_join(tid[i], 0);
+ PTH_CALL(pthread_join(tid[i], 0));
}
fprintf(stderr, "Finished.\n");