1

pthread で C プログラムを書いています。スレッドを開始して実行した後、説明できない理由で、2 つの pthread のいずれかの値がバックグラウンドで 0 に変更されます。私のマシンでは、この問題はすでに

printf( "Created thread %d !\n", id2 );

printf( "id2==%d !\n", id2 );

Cコードは次のとおりです。

#include "mutex.h"
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_t id1;
pthread_t id2;
unsigned char mutex = 0;


void* run(  )
{
  pthread_t s=pthread_self();
  printf( "Thread(%d) starting.\n", s );

  mutex_lock( &mutex );
  printf( "Working in the critical area for 2s.\n" );
  sleep( 2 );
  mutex_unlock( &mutex );

  s=pthread_self();
  printf( "Thread(%d) exiting.\n", s );

  pthread_exit( NULL );
}


int main()
{
  if( pthread_create( &id1, NULL, run, NULL ) )
  {
    perror( "pthread_create failed!" );
    exit( EXIT_FAILURE );
  }
  printf( "Created thread %d !\n", id1 );
  if( pthread_create( &id2, NULL, run, NULL ) )
  {
    perror( "pthread_create failed!" );
    exit( EXIT_FAILURE );
  }
  printf( "Created thread %d !\n", id2 );

  int r=0;
  printf( "Ready for joining thread %d !\n", id1 );
  printf( "id2==%d !\n", id2 );
  if( ( r=pthread_join( id1, NULL ) ) )
  {
    fprintf( stderr, "%d==pthread_join( id1, ... ) failed!\n", r );
    exit( EXIT_FAILURE );
  }
  printf( "Ready for joining thread %d !\n", id2 );
  if( ( r=pthread_join( id2, NULL ) ) )
  {
    fprintf( stderr, "%d==pthread_join( id2, ... ) failed!\n", r );
    exit( EXIT_FAILURE );
  }
  exit( EXIT_SUCCESS );
}

私の機能ロックとロック解除は次のようになります。

void mutex_lock( unsigned char* m )
{
  printf( "mutex_lock()\n" );
  while( tsl( m )==1 );
  printf( "mutex locked\n" );
}


void mutex_unlock( unsigned char* m )
{
  printf( "mutex_unlock()\n" );
  *m=0;
  printf( "mutex unlocked\n" );
}

pthread ID が突然変更されるのはなぜですか?

4

0 に答える 0