Skip to content

Instantly share code, notes, and snippets.

@tony2001
Created July 30, 2015 14:15
Show Gist options
  • Save tony2001/704232243bda6ff126ea to your computer and use it in GitHub Desktop.
Save tony2001/704232243bda6ff126ea to your computer and use it in GitHub Desktop.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define THREAD_NUM 10
#define ARRAY_SIZE 100
pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER;
struct data {
size_t counter;
size_t array[ARRAY_SIZE];
};
struct data *ptr[2];
struct data *ptr_writer;
struct data *ptr_collector;
void *writer_func(void *arg)
{
size_t thread_num = (size_t)arg;
while (1) {
struct data *data_ptr;
/* READ lock, write data */
pthread_rwlock_rdlock(&lock);
data_ptr = &ptr_writer[thread_num];
if (data_ptr->counter < ARRAY_SIZE) {
data_ptr->array[data_ptr->counter] = 1; //<--------- write
data_ptr->counter++;
}
pthread_rwlock_unlock(&lock);
usleep(1000);
}
}
void *collector_func(void *arg)
{
struct data *tmp_ptr;
int i, j;
size_t num, sum;
while (1) {
/* WRITE lock, exchange and release */
pthread_rwlock_wrlock(&lock);
tmp_ptr = ptr_writer;
ptr_writer = ptr_collector;
ptr_collector = tmp_ptr;
pthread_rwlock_unlock(&lock);
num = sum = 0;
for (i = 0; i < THREAD_NUM; i++) {
num += ptr_collector[i].counter;
for (j = 0; j < ptr_collector[i].counter; j ++) { //<----------- read
sum += ptr_collector[i].array[j]; //<----------- read
}
ptr_collector[i].counter = 0;
}
printf("num: %zd, sum: %zd\n", num, sum);
usleep(10000);
}
}
int main() {
pthread_t writers[THREAD_NUM];
pthread_t collector;
size_t i;
ptr[0] = calloc(THREAD_NUM, sizeof(struct data));
ptr[1] = calloc(THREAD_NUM, sizeof(struct data));
ptr_writer = ptr[0];
ptr_collector = ptr[1];
pthread_create(&collector, NULL, collector_func, NULL);
for (i = 0; i < THREAD_NUM; i++) {
pthread_create(&writers[i], NULL, writer_func, (void *)i);
}
pthread_join(collector, NULL);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment