// thready.c #include #include #include 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; }