#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <pthread.h>
#define THREADS 5
#define DATA 100
typedef struct _pthread_arg_t {
pthread_t thread;
int *data;
unsigned int end;
int max;
} pthread_arg_t;
void* pthread_routine(void *arg) {
pthread_arg_t *info = (pthread_arg_t*) arg;
int *it = info->data,
*end = info->data + info->end;
while (it < end) {
if (*it > info->max) {
info->max = *it;
}
it++;
}
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
pthread_arg_t threads[THREADS];
int data[DATA],
thread = 0,
limit = 0,
result = 0;
memset(&threads
, 0, sizeof(pthread_arg_t
) * THREADS
); memset(&data
, 0, sizeof(int) * DATA
);
while (limit < DATA) {
/* you can replace this with randomm number */
data[limit] = limit;
limit++;
}
limit = DATA/THREADS;
while (thread < THREADS) {
threads[thread].data = &data[thread * limit];
threads[thread].end = limit;
if (pthread_create(&threads[thread].thread, NULL, pthread_routine, &threads[thread]) != 0) {
/* do something */
return 1;
}
thread++;
}
thread = 0;
while (thread < THREADS) {
if (pthread_join(threads[thread].thread, NULL) != 0) {
/* do something */
return 1;
}
thread++;
}
thread = 0;
result = threads[0].max;
while (thread < THREADS) {
thread * limit,
thread * limit + limit - 1,
threads[thread].max);
if (threads[thread].max > result) {
result = threads[thread].max;
}
thread++;
}
return 0;
}
CSNpbmNsdWRlIDxzdGRsaWIuaD4KCSNpbmNsdWRlIDxzdHJpbmcuaD4KCSNpbmNsdWRlIDxzdGRpby5oPgoJI2luY2x1ZGUgPHB0aHJlYWQuaD4KCgkjZGVmaW5lIFRIUkVBRFMgNQoJI2RlZmluZSBEQVRBIDEwMAoKCXR5cGVkZWYgc3RydWN0IF9wdGhyZWFkX2FyZ190IHsKCQlwdGhyZWFkX3QgdGhyZWFkOwoJCWludCAqZGF0YTsKCQl1bnNpZ25lZCBpbnQgZW5kOwoJCWludCBtYXg7Cgl9IHB0aHJlYWRfYXJnX3Q7CgoJdm9pZCogcHRocmVhZF9yb3V0aW5lKHZvaWQgKmFyZykgewoJCXB0aHJlYWRfYXJnX3QgKmluZm8gPSAocHRocmVhZF9hcmdfdCopIGFyZzsKCQlpbnQgKml0ID0gaW5mby0+ZGF0YSwKCQkJKmVuZCA9IGluZm8tPmRhdGEgKyBpbmZvLT5lbmQ7CgoJCXdoaWxlIChpdCA8IGVuZCkgewoJCQlpZiAoKml0ID4gaW5mby0+bWF4KSB7CgkJCQlpbmZvLT5tYXggPSAqaXQ7CgkJCX0KCQkJaXQrKzsKCQl9CgoJCXB0aHJlYWRfZXhpdChOVUxMKTsKCX0KCglpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CgkJcHRocmVhZF9hcmdfdCB0aHJlYWRzW1RIUkVBRFNdOwoJCWludCBkYXRhW0RBVEFdLAoJCQl0aHJlYWQgPSAwLAoJCQlsaW1pdCA9IDAsCgkJCXJlc3VsdCA9IDA7CgkKCQltZW1zZXQoJnRocmVhZHMsIDAsIHNpemVvZihwdGhyZWFkX2FyZ190KSAqIFRIUkVBRFMpOwkKCQltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihpbnQpICogREFUQSk7CgoJCXdoaWxlIChsaW1pdCA8IERBVEEpIHsKCQkJLyogeW91IGNhbiByZXBsYWNlIHRoaXMgd2l0aCByYW5kb21tIG51bWJlciAqLwoJCQlkYXRhW2xpbWl0XSA9IGxpbWl0OwoJCQlsaW1pdCsrOwoJCX0KCgkJbGltaXQgPSBEQVRBL1RIUkVBRFM7CgoJCXdoaWxlICh0aHJlYWQgPCBUSFJFQURTKSB7CgkJCXRocmVhZHNbdGhyZWFkXS5kYXRhID0gJmRhdGFbdGhyZWFkICogbGltaXRdOwoJCQl0aHJlYWRzW3RocmVhZF0uZW5kID0gbGltaXQ7CgkJCWlmIChwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkc1t0aHJlYWRdLnRocmVhZCwgTlVMTCwgcHRocmVhZF9yb3V0aW5lLCAmdGhyZWFkc1t0aHJlYWRdKSAhPSAwKSB7CgkJCQkvKiBkbyBzb21ldGhpbmcgKi8KCQkJCXJldHVybiAxOwoJCQl9CgkJCXRocmVhZCsrOwoJCX0KCgkJdGhyZWFkID0gMDsKCQl3aGlsZSAodGhyZWFkIDwgVEhSRUFEUykgewoJCQlpZiAocHRocmVhZF9qb2luKHRocmVhZHNbdGhyZWFkXS50aHJlYWQsIE5VTEwpICE9IDApIHsKCQkJCS8qIGRvIHNvbWV0aGluZyAqLwoJCQkJcmV0dXJuIDE7CgkJCX0KCQkJdGhyZWFkKys7CgkJfQoKCQl0aHJlYWQgPSAwOwoJCXJlc3VsdCA9IHRocmVhZHNbMF0ubWF4OwoJCXByaW50ZigicmVzdWx0OlxuIik7CgkJd2hpbGUgKHRocmVhZCA8IFRIUkVBRFMpIHsKCQkJcHJpbnRmKCJcdCVkIC0gJWQ6ICVkXG4iLAoJCQkJdGhyZWFkICogbGltaXQsCgkJCQl0aHJlYWQgKiBsaW1pdCArIGxpbWl0IC0gMSwKCQkJCXRocmVhZHNbdGhyZWFkXS5tYXgpOwoJCQlpZiAodGhyZWFkc1t0aHJlYWRdLm1heCA+IHJlc3VsdCkgewoJCQkJcmVzdWx0ID0gdGhyZWFkc1t0aHJlYWRdLm1heDsKCQkJfQoJCQl0aHJlYWQrKzsKCQl9CgkJcHJpbnRmKCJtYXhcdCVkXG4iLCByZXN1bHQpOwoKCQlyZXR1cm4gMDsKCX0=