Created
July 30, 2015 13:45
-
-
Save tony2001/2fa849eb3fbb88e2fe35 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 { | |
int counter; | |
int 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]; | |
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