rendered paste body// thready.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _blah {
int status;
int start_counter;
int stop_counter;
pthread_mutex_t mutex;
}BLAH;
static void *worker_thread(void *arg)
{
BLAH *blah = (BLAH *)arg;
// fprintf(stderr, "...thread %i started\n", thread_self());
if (pthread_mutex_lock(&blah->mutex) != 0) {
fprintf(stderr, "could not lock mutex\n");
}
// thread_mutex_lock(&blah->mutex);
blah->start_counter += 1;
if (pthread_mutex_unlock(&blah->mutex) < 0) {
fprintf(stderr, "could not unlock mutex\n");
}
// thread_mutex_unlock(&blah->mutex);
while(blah->status) {
usleep(100000);
}
// fprintf(stderr, "...thread %i stopped\n", thread_self());
if (pthread_mutex_lock(&blah->mutex) != 0) {
fprintf(stderr, "could not lock mutex\n");
}
// thread_mutex_lock(&blah->mutex);
blah->stop_counter += 1;
if (pthread_mutex_unlock(&blah->mutex) < 0) {
fprintf(stderr, "could not unlock mutex\n");
fprintf(stderr, "could not unlock mutex\n");
}
// thread_mutex_unlock(&blah->mutex);
return NULL;
}
int main()
{
int ii = 0;
int result = 0;
pthread_t thread[1024];
BLAH blah;
blah.status = 1;
blah.start_counter = 0;
blah.stop_counter = 0;
if (pthread_mutex_init(&blah.mutex, NULL) < 0) {
fprintf(stderr, "could not init mutex\n");
}
// thread_mutex_init(&blah.mutex);
for(ii = 0; ii < 1024; ii++ ) {
fprintf(stderr, "...%i\n", ii);
// if((result = thread_create(&(thread[ii]), worker_thread, (void *)&blah)) < 0) {
if ((result = pthread_create(&(thread[ii]), NULL, worker_thread, (void *)&blah)) < 0) {
fprintf(stderr, "error - failed to spawn thread %i with %i.\n", ii, result);
return 1;
}
}
sleep(5);
// thread_mutex_lock(&blah.mutex);
if (pthread_mutex_lock(&blah.mutex) != 0) {
fprintf(stderr, "could not lock mutex\n");
}
fprintf(stderr, "...%i threads started\n", blah.start_counter);
blah.status = 0;
if (pthread_mutex_unlock(&blah.mutex) != 0) {
fprintf(stderr, "could not unlock mutex\n");
}
// thread_mutex_unlock(&blah.mutex);
sleep(5);
if (pthread_mutex_lock(&blah.mutex) != 0) {
fprintf(stderr, "could not lock mutex\n");
}
// thread_mutex_lock(&blah.mutex);
fprintf(stderr, "...%i threads stopped\n", blah.stop_counter);
if (pthread_mutex_unlock(&blah.mutex) != 0) {
fprintf(stderr, "could not unlock mutex\n");
}
// thread_mutex_unlock(&blah.mutex);
// thread_mutex_destroy(&blah.mutex);
if (pthread_mutex_destroy(&blah.mutex) < 0) {
fprintf(stderr, "could not destroy mutex\n");
}
return 0;
}