All pastes #368355 Raw Edit

Stuff

public text v1 · immutable
#368355 ·published 2007-02-23 00:43 UTC
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;
}