Created
July 30, 2015 14:15
-
-
Save tony2001/704232243bda6ff126ea to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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