zoukankan      html  css  js  c++  java
  • 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 );
    }
    

      

  • 相关阅读:
    Leetcode Excel Sheet Column Number
    AlgorithmsI PA2: Randomized Queues and Deques Subset
    AlgorithmsI PA2: Randomized Queues and Deques RandomizedQueue
    AlgorithmsI PA2: Randomized Queues and Deques Deque
    AlgorithmsI Programming Assignment 1: PercolationStats.java
    hdu多校第四场 1003 (hdu6616) Divide the Stones 机智题
    hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对
    hdu多校第四场1001 (hdu6614) AND Minimum Spanning Tree 签到
    hdu多校第三场 1007 (hdu6609) Find the answer 线段树
    hdu多校第三场 1006 (hdu6608) Fansblog Miller-Rabin素性检测
  • 原文地址:https://www.cnblogs.com/lxgeek/p/2133639.html
Copyright © 2011-2022 走看看