a threadpool by c

#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\n", 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\n", pthread_self(), name );

                pop();

                delete_task();

                printf( "thread id is %uld and value is %d\n", pthread_self(), name );



        }



}





int

main( int argc, char** argv )

{

        int i = 0;



        if ( argc != 3 )

        {

                printf( "./t20 n m\n" );

                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 );

}

  

你可能感兴趣的:(ThreadPool)