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