|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Senior Member
Iscritto dal: Nov 2000
Messaggi: 342
|
Thread e pthread_cond_broadcast
ragazzi mi serve un chiarimento su questo programmino:
Codice:
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int variabile1 = 0;
int variabile2 = 0;
void* test1( void *argv )
{
printf( "Thread %li in attesa su mutex1\n", pthread_self() );
pthread_mutex_lock( &mutex1 );
while( variabile1 == 0 )
pthread_cond_wait( &cond, &mutex1 );
pthread_mutex_unlock( &mutex1 );
printf("[%li] variabile è ora %d mutex1\n", pthread_self(), variabile1 );
return 0;
}
void* test2( void *argv )
{
printf( "Thread %li in attesa su mutex2\n", pthread_self() );
pthread_mutex_lock( &mutex2 );
while( variabile2 == 0 )
pthread_cond_wait( &cond, &mutex2 );
pthread_mutex_unlock( &mutex2 );
printf("[%li] variabile è ora %d\n mutex2", pthread_self(), variabile2 );
return 0;
}
int main( int argc, char *argv[] )
{
pthread_t t1, t2, t3;
pthread_create( &t1, NULL, test1, NULL);
pthread_create( &t2, NULL, test2, NULL);
pthread_create( &t3, NULL, test2, NULL);
sleep( 2 );
pthread_mutex_lock( &mutex1 );
variabile1 = 1;
pthread_mutex_unlock( &mutex1 );
pthread_mutex_lock( &mutex2 );
variabile2 = 1;
pthread_mutex_unlock( &mutex2 );
pthread_cond_broadcast( &cond );
pthread_join( t1, NULL );
pthread_join( t2, NULL );
pthread_join( t3, NULL );
return 0;
}
Codice:
bash-2.05b$ ./tb Thread 1083485104 in attesa su mutex1 Thread 1091881904 in attesa su mutex2 Thread 1100274608 in attesa su mutex2 [1083485104] variabile è ora 1 mutex1 Ora vorrei capire bene il perchè. La pthread_cond_broadcast non dovrebbe svegliare _tutti_ i thread in attesa su cond? la man page riporta queste righe Quote:
Se così non fosse(come sembra) mi troverei in difficoltà, perchè ho threads in attesa sulla stessa variabile cond ma blocco mutex differenti. per ovviare posso usare pthread_cond_signal e richiamarla una volta per thread ma vorrei evitare. Sapete darmi qualche dritta? Ciao Arpeda
__________________
Membro di HWU Scout Group || Quello che ieri era fantascienza oggi è realtà, quello che oggi è realtà domani sarà solo un ricordo ... Powered by Gentoo 1.4 on kernel 2.6.12.-gentoo-r4 |
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
WorksForMe (TM)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Rettifico: mi funziona su un biprocessone, non su un monoprocessore (!).
Utilizzando un unico mutex, funziona anche sul monoprocessore.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2000
Messaggi: 342
|
già di questo me ne ero accorto
però non posso usare lo stesso mutex per bloccare i thread. questo è un esempietto per cercare di capire il funzionamento corretto della broadcast che poi devo applicare in un contesto più ampio. non ci sono problemi a fare diverse signal ma 1) stilisticamente non mi piace 2) perchè la broadcast (e 2 mutex) non dovrebbe funzionare bene anche su un monoprocessore? sembrerebbe che su un monoprocessore riveglia l'accoppiata mutex/condizione ma se modifico Codice:
pthread_mutex_lock( &mutex1 ); variabile1 = 1; pthread_mutex_unlock( &mutex1 ); pthread_mutex_lock( &mutex2 ); variabile2 = 1; pthread_mutex_unlock( &mutex2 ); pthread_cond_broadcast( &cond ); Codice:
pthread_mutex_lock( &mutex1 ); variabile1 = 1; pthread_cond_broadcast( &cond ); pthread_mutex_unlock( &mutex1 ); pthread_mutex_lock( &mutex2 ); variabile2 = 1; pthread_cond_broadcast( &cond ); pthread_mutex_unlock( &mutex2 ); Any ideas? ciao Arpeda
__________________
Membro di HWU Scout Group || Quello che ieri era fantascienza oggi è realtà, quello che oggi è realtà domani sarà solo un ricordo ... Powered by Gentoo 1.4 on kernel 2.6.12.-gentoo-r4 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Perché non fai le cose come devono essere fatte?
Codice:
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
int variabile1 = 0;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
int variabile2 = 0;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
void* test1( void *argv )
{
printf( "Thread %li in attesa su mutex1\n", pthread_self() );
pthread_mutex_lock(&mutex1);
while(!variabile1)
pthread_cond_wait(&cond1, &mutex1);
pthread_mutex_unlock(&mutex1);
printf("[%li] variabile1 è ora %d\n", pthread_self(), variabile1);
return 0;
}
void* test2( void *argv )
{
printf( "Thread %li in attesa su mutex2\n", pthread_self() );
pthread_mutex_lock( &mutex2);
pthread_cond_wait( &cond2, &mutex2);
pthread_mutex_unlock( &mutex2);
printf("[%li] variabile è ora %d\n", pthread_self(), variabile2 );
return 0;
}
int main( int argc, char *argv[] )
{
pthread_t t1, t2, t3;
pthread_create( &t1, NULL, test1, NULL);
pthread_create( &t2, NULL, test2, NULL);
pthread_create( &t3, NULL, test2, NULL);
sleep(1);
pthread_mutex_lock(&mutex1);
variabile1 = 1;
pthread_mutex_unlock(&mutex1);
pthread_mutex_lock(&mutex2);
variabile2 = 1;
pthread_mutex_unlock(&mutex2);
pthread_cond_broadcast( &cond1 );
pthread_cond_broadcast( &cond2 );
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_join(t3, NULL);
return 0;
}
Nel tuo programma c'è un errore concettuale: due thread accedono a cond senza serializzazione (in quanto uno blocca un mutex, il secondo ne blocca un altro => race su cond).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2000
Messaggi: 342
|
Azz nn avevo pensato ad una race condition su cond!
Grazie della dritta ora vedo un po se posso modificare le cose. Ciao Arpeda
__________________
Membro di HWU Scout Group || Quello che ieri era fantascienza oggi è realtà, quello che oggi è realtà domani sarà solo un ricordo ... Powered by Gentoo 1.4 on kernel 2.6.12.-gentoo-r4 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:58.



















