a threadpool by c

3720 단어 ThreadPool
#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include <assert.h>

#include <pthread.h>



#define FALSE 0



pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_mutex_t task_mutex = PTHREAD_MUTEX_INITIALIZER;

struct temp

{

        int name;

};



#define STACK_TYPE struct temp*



typedef struct STACK_NODE

{

        STACK_TYPE value;

        struct STACK_NODE *next;

} StackNode;



static StackNode *stack;

static int task_num = 0;

/**

 * create_stack

 */

void

create_stack( size_t size )

{



}



/**

 * Push

 */

void

push( int value )

{

        pthread_mutex_lock( &thread_mutex );



        StackNode *new_node;



        new_node = malloc( sizeof( StackNode ) );

        assert( new_node != NULL );

        new_node->value = malloc( sizeof( struct temp ) );

        assert( new_node->value != NULL );

        (new_node->value)->name = value;

        new_node->next = stack;

        stack = new_node;



        pthread_mutex_unlock( &thread_mutex );

}



/**

 * is_empty

 */

int

is_empty( void )

{

        return stack == NULL;

}



/**

 * Pop

 */

void

pop( void )

{

        pthread_mutex_lock( &thread_mutex );



        StackNode *first_node;



        assert( !is_empty() );

        first_node = stack;

        stack = first_node->next;

        free( first_node );



        //printf( "task_num is %d
", task_num ); pthread_mutex_unlock( &thread_mutex ); } /** * top */ int top( void ) { //assert( !is_empty() ); pthread_mutex_lock( &thread_mutex ); assert( !is_empty() ); int name = stack->value->name; pthread_mutex_unlock( &thread_mutex ); return name; } /** * is_full */ int is_full( void ) { return FALSE; } /** * destroy_stack */ void destory( void ) { pthread_mutex_lock( &thread_mutex ); while( !is_empty() ) pop(); pthread_mutex_unlock( &thread_mutex ); } int get_task() { pthread_mutex_lock( &task_mutex ); int num = task_num; pthread_mutex_unlock( &task_mutex ); return num; } void delete_task() { pthread_mutex_lock( &task_mutex ); task_num--; pthread_mutex_unlock( &task_mutex ); } void* thread_handle( void* arg ) { int name; while( get_task() != 0 ) { name = top(); //printf( "thread id is %uld and value is %d
", pthread_self(), name ); pop(); delete_task(); printf( "thread id is %uld and value is %d
", pthread_self(), name ); } } int main( int argc, char** argv ) { int i = 0; if ( argc != 3 ) { printf( "./t20 n m
" ); exit( 1 ); } int n_thread = atoi( argv[1] ); int n_task = atoi( argv[2] ); task_num = n_task; for ( ; i < n_task; i++ ) push( i ); pthread_t *t; t = malloc( sizeof( pthread_t ) * n_thread ); assert( t != NULL ); for ( i = 0; i < n_thread; i++ ) { pthread_create( (t + i), NULL, thread_handle, NULL ); //pthread_join( *(t + i), NULL ); } for ( i = 0; i < n_thread; i++ ) { pthread_join( *(t + i), NULL ); } free( t ); exit( 0 ); }

좋은 웹페이지 즐겨찾기