Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-12-2010, 17:57   #1
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
[C/Unix]SIGSEGV su pthread_join()

Salve,
sono di nuovo alle prese con il threading in Unix.
Probabilmente sono sfortunato, ma non funziona una cippa come dovrebbe.

In questo caso, la chiamata a pthread_join fallisce miseramente con una SIGSEGV ogniqualvolta venga chiamata.

Nel progetto wrappo la chiamata in questo modo:
Codice:
int thread_join( int TID )
{
	DEBUG_ASSERT( TID != 0 );
	
	return NOERROR( pthread_join( (pthread_t)TID, NULL ) );
}
Sono sicuro che:
-i thread vengono fatti partire con successo
-succede sia se sono in esecuzione, sia se sono in wait, sia se sono terminati
-TID in ingresso è effettivamente il pthread_t restituito da pthread_create

Però in _qualsiasi_ modo io chiami pthread_join, mi becco una SIGSEGV.
Mistero

EDIT:
se chiamo pthread_join(0,0), inspiegabilmente, funziona. Quindi vuol dire che proprio quei TID che sto provando a chiamare io non sono validi... deve esserci un qualche errore alla creazione, perchè il thread viene creato ed è valido, ma il pthread_t ritornato no.

Codice:
int thread_start( void(*runnableFunction)(void*), void* buf )
{
	int error; 
	pthread_t TID;
	void*(*start_routine)(void*) = (void*(*)(void*))runnableFunction;

	DEBUG_ASSERT( runnableFunction );

	error = pthread_create( 
			&TID, 
			NULL,
			start_routine,
			buf );

	return (error==0) ? (int)TID : 0;
}
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 23-12-2010 alle 18:36.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2010, 19:51   #2
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Qualcuno mi salvi!

Non riesco a trovare il modo di farlo andare...
mi andrebbe bene anche un link ad un forum internazionale più adeguato a questi argomenti!
Non fatemi scomodare il prof
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2010, 21:43   #3
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
boh di certo non capisco perché usi int invece di pthread_t, sei così sicuro che pthread_t sia definito come int? cercando in giro non ho trovato molto, solo questo in cui è definito come unsigned long (questo spiegherebbe perché il valore che ritorni non è valido)
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2010, 22:12   #4
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Sono convinto anche io che il problema stia nel fatto che mescoli pthread_t ed int.
In particolare e' facile che in una macchina a 64 bit quel pthread_t sia a 64 bit, con tutte le conseguenze del caso.
Non mescolare, hai alternative piu' sane a disposizione che non ritornare uno 0 in caso di fallimento, come lanciare un'eccezione, ritornare un puntatore a un pthread_t o ritornare solo lo stato di errore (come fa pthread_create) ed accettare il pthread_t come argomento.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 00:53   #5
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
uhm... faccio il cast ad int per una questione di compatibilità: la stessa funzione su Win32 fa un cast di una HANDLE.
int agisce da "contenitore opaco" rispetto all'user, che lo può usare come identificatore.

Quindi
-non posso lanciare un'eccezione (C liscio)
-non posso parlare esplicitamente di pthread_t

Però se è vero che il problema è il tipo di dato, potrei definire un tipo thread_t definito come pthread_t su Unix e come HANDLE su Win32.
Oppure usare long invece che int, così se ne occupa direttamente il compilatore.
Alla fine mi sembra sia la cosa più sana.

EDIT: usando "#define thread_t unsigned long" funziona alla perfezione su tutti i SO, grazie mille
Il problema era molto più stupido del previsto
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 15:30   #6
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
ancora però, sei sicuro che sia generico a sufficienza? io fossi in te, se dovessi fare una qualche sorta di libreria cross platform per i thread userei una struttura dati che mappi il tipo del thread id con un intero, tipo map<int, pthread_t (o HANDLE)> per dirlo in termini di c++

così puoi rifarti alla definizione di pthread_t e HANDLE e usare un tuo tipo come "handle"

Ultima modifica di tuccio` : 27-12-2010 alle 15:58.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2010, 15:58   #7
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Sicuramente si, sarebbe la cosa migliore... sicuramente in C++, dove è più gestibile, l'avrei fatto.. in è più difficile da mantenere.
E poi col "rischio" tutto si riduce a un cast, mentre con le strutture dati ho anche un costo di ricerca
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2010, 12:43   #8
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Tommo Guarda i messaggi
EDIT: usando "#define thread_t unsigned long" funziona alla perfezione su
tutti i SO, grazie mille
Perche' allora non utilizzare direttamente pthread_t invece che l'unsigned long ? (E magari un typedef, o una struttura opaca)
[/quote]
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2010, 12:54   #9
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Perche' allora non utilizzare direttamente pthread_t invece che l'unsigned long ? (E magari un typedef, o una struttura opaca)
Per il semplice fatto che pthread_t è di dimensione diversa da HANDLE.
Quindi se creo pthread_t[100] quello è grosso 800b su architetture x64, ma HANDLE[100] è sempre grosso 400 perchè è proprio un'int.

E questo può generare dei comportamenti imprevedibili lato utente che con long mi risparmio.
Tanto sprecare 4 byte su un'handle non credo proprio che sia un problema.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2010, 15:20   #10
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
credo che voglia dire una cosa tipo

typedef pthread_t mythread_t;

su linux e

typedef HANDLE mythread_t;

su windows

e thread_join ritorna un mythread_t invece di un unsigned int in entrambi i casi
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2010, 21:56   #11
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
credo che voglia dire una cosa tipo

typedef pthread_t mythread_t;

su linux e

typedef HANDLE mythread_t;

su windows

e thread_join ritorna un mythread_t invece di un unsigned int in entrambi i casi
Si' esatto. Se la dimensione differente tra le due piattaforme e' un problema (ma non dovrebbe esserlo, perche' comunque le cose cambiano tra 32 e 64, sizeof(pthread_t) e' 4 sotto i 32 bit), si puo' usare una union in modo da richiedere lo spazio necessario.
Codice:
typedef union
{
#if defined(WIN32) /* o _WIN32 ? Non ricordo :D */
    HANDLE handle;
#elif defined(__unix__) /* Non standard, ma non ricordo la macro corretta... :P */
    pthread_t handle;
#endif
    char _filler[8];
}  mythread_t;
Meno rischiosa che cast a manetta (anche se, secondo me, inutile).
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Space Pioneer starebbe realizzando un pr...
SpaceX ritirerà ''a breve'' il Fa...
La Luna ha un nuovo cratere di grandi di...
ROG Cronox: ASUS alza l'asticella dei ca...
Lenovo annuncia nuovi sistemi per la vir...
M6 e M5 Ultra, i primi benchmark conferm...
La nuova falla della cybersecurity &egra...
The Blood of Dawnwalker, il sequel potre...
Colpiti i data center Amazon: irrecupera...
Google Wallet, nuova interfaccia in arri...
iPhone Duo, problemi di produzione per i...
Firefox diventa più veloce con PDF e JPE...
WhatsApp, arriva su iOS la nuova scorcia...
Snap presenta Specs: realtà aumentata, c...
SteamOS verso un cambiamento epocale: ar...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:36.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v