#include <err.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LOOP_MAIN 64
#define NTHREADS 16
static pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
static char msg[128] = "default message";
void
set_msg(int self_n, char *new_msg)
{
pthread_t self = pthread_self();
if (pthread_rwlock_wrlock(&rwlock) != 0)
err(EXIT_FAILURE, "set_msg: pthread_rwlock_wrlock");
printf("%p: %d: set_msg\n", self, self_n);
strlcpy(msg, new_msg, sizeof(msg));
if (pthread_rwlock_unlock(&rwlock) != 0)
err(EXIT_FAILURE, "set_msg: pthread_rwlock_unlock");
}
void
print_msg(int self_n)
{
pthread_t self = pthread_self();
if (pthread_rwlock_rdlock(&rwlock) != 0)
err(EXIT_FAILURE, "print_msg: pthread_rwlock_rdlock");
printf("%p: %d: msg: \"%s\"\n", self, self_n, msg);
if (pthread_rwlock_unlock(&rwlock) != 0)
err(EXIT_FAILURE, "print_msg: pthread_rwlock_unlock");
}
void *
run(void *data)
{
int self_n = (int)data;
pthread_t self = pthread_self();
printf("%p: %d: enter run()\n", self, self_n);
set_msg(self_n, "new message");
print_msg(self_n);
printf("%p: %d: exit run()\n", self, self_n);
return NULL;
}
int
main(int argc, char *argv[])
{
int i, j;
if (setenv("RTHREAD_DEBUG", "9", 0) == -1)
err(EXIT_FAILURE, "setenv");
for (i=0; i < LOOP_MAIN; i++) {
pthread_t handlers[NTHREADS];
printf("main: %d\n", i);
for (j=0; j < NTHREADS; j++) {
if (pthread_create(&(handlers[j]), NULL,
&run, (void *)(long)j) != 0)
err(EXIT_FAILURE, "main: pthread_create");
}
for (j=0; j < NTHREADS; j++) {
if (pthread_join(handlers[j], NULL) != 0)
err(EXIT_FAILURE, "main: pthread_join");
}
}
return EXIT_SUCCESS;
}