/* Code Example 3 */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUMBER_OF_KEYS_WE_USE ...
#define MAX_NUMBER_OF_THREADS ...
/* global key to the thread specific data */
pthread_key_t priority_key;
/* function prototypes */
void* client_thread( void* );
void prepare_data( void );
void lump_send( data_t );
int main( void )
{
int n;
pthread_t
thread_id[MAX_NUMBER_OF_THREADS];
...
/* check that the implementation can cope
* with all the keys we need */
if ( NUMBER_OF_KEYS_WE_USE >
PTHREAD_KEYS_MAX ) {
fprintf( stderr,
"Not enough keys available\n");
exit( -1 );
}
/* create the keys that we need. We're
* going to use "malloc()" to grab
* some memory and point the thread specific
* data at it. If the thread dies, we'd like
* the system to use "free()" to
* release that memory for us
*/
pthread_key_create( &priority_key, free );
...
/* create the threads */
pthread_create( &thread_id[n], NULL,
client_thread, NULL );
...
}
void* client_thread( void* arg )
{
/* grab enough memory to store an int, and
* store a pointer to that memory as thread
* specific data
*/
pthread_setspecific( priority_key,
malloc( sizeof( int ) ) );
...
prepare_data();
...
}
void prepare_data( void )
{
data_t some_data;
...
/* store the priority value in the
* memory pointed to by the thread
* specific data
*/
*((int*)pthread_getspecific(
priority_key )) = 1;
...
lump_send( some_data );
...
}
void lump_send( data_t some_data )
{
/* act on the value stored in the memory
* pointed to by the thread specific data
*/
switch( *((int*)pthread_getspecific(
priority_key )) )
{
case 1: /* do one thing */
break;
case 2: /* do something else */
break;
}
}
Copyright © 1994 - 2018 Linux Journal. All rights reserved.