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

  

原文地址:https://www.cnblogs.com/lxgeek/p/2133639.html