Sto lavorando a un demone Haskell che utilizza POSIX fork/exec insieme al meccanismo di blocco dei file. I miei esperimenti mostrano che i blocchi di file non vengono ereditati durante il periodo executeFile
con il runtime -threaded
(vedere anche this thread), non importa se io uso +RTS -N
o no. Quindi vorrei aggiungere un assegno per essere sicuro che il demone non sia compilato con -threaded
. C'è un modo portatile per rilevarlo?Come rilevare se un programma è stato compilato usando -threaded?
13
A
risposta
13
C'è un value in Control.Concurrent
per questo, ad esempio:
module Main (main) where
import Control.Concurrent
main :: IO()
main = print rtsSupportsBoundThreads
e test:
$ ghc -fforce-recomp Test.hs; ./Test
[1 of 1] Compiling Main (Test.hs, Test.o)
Linking Test ...
False
$ ghc -fforce-recomp -threaded Test.hs; ./Test
[1 of 1] Compiling Main (Test.hs, Test.o)
Linking Test ...
True
Ed è C-parte source code:
HsBool
rtsSupportsBoundThreads(void)
{
#if defined(THREADED_RTS)
return HS_BOOL_TRUE;
#else
return HS_BOOL_FALSE;
#endif
}
1
Questo è un hack sporco e potrebbe non essere portatile, ma posso confermare che funziona per GHC-7.6.3 su Linux:
isThreaded :: IO (Maybe Bool)
isThreaded = do
tid <- forkIO $ threadDelay 1000000
yield
stat <- threadStatus tid
killThread tid
case stat of
ThreadBlocked BlockedOnMVar -> return (Just True)
ThreadBlocked BlockedOnOther -> return (Just False)
_ -> return Nothing
Vedi BlockedOnOther docstring per i dettagli.
Problemi correlati
- 1. verifica se un file binario è stato compilato con "-static"
- 2. Come verificare se il programma è stato compilato con i simboli di debug?
- 3. Come posso rilevare se un iframe è stato caricato?
- 4. Qualsiasi modo per determinare quando un programma .net è stato compilato/compilato
- 5. Come identificare se Swift è stato compilato con Ottimizzazione
- 6. rilevare se un metodo è stato sovrascritto utilizzando Reflection (C#)
- 7. come verificare se un file è stato selezionato usando javascript?
- 8. è Scrapy single-threaded o multi-threaded?
- 9. Come posso decodificare un programma Perl che è stato compilato con perlcc?
- 10. C'è un modo per dire dalla JVM se un particolare metodo è stato compilato con JIT?
- 11. Come posso rilevare se un Chrome Extension è stato abilitato (dopo essere stato disabilitato)
- 12. Come posso dire, con qualcosa come objdump, se un file oggetto è stato compilato con -fPIC?
- 13. Come sapere se un assembly .NET è stato compilato come x86, x64 o qualsiasi CPU
- 14. Come rilevare se è presente un microfono
- 15. Come posso verificare se il mio programma è compilato per processore a 32 o 64 bit?
- 16. Come rilevare se un tipo lungo è effettivamente NULL?
- 17. Come scoprire se un assembly .NET è stato compilato con il flag TRACE o DEBUG
- 18. Come rilevare quando Mousemove è stato interrotto
- 19. Come rilevare se è supportata un'interfaccia grafica?
- 20. Rilevare se un'eccezione è un'eccezione di stato danneggiato
- 21. usando stat per rilevare se esiste un file (lento?)
- 22. Come può un bean Spring rilevare se esso stesso è stato avvolto in un proxy AOP?
- 23. è tesseract 3.00 multi-threaded?
- 24. Perché questo codice è stato compilato?
- 25. C#: verificare se è stato premuto un tasto nella console
- 26. Come può il mio programma rilevare se è in esecuzione su un particolare dominio?
- 27. Come rilevare se un utente si è disconnesso, in php?
- 28. C'è un modo per rilevare se un file Excel è stato generato su Windows o Mac usando PHPExcel?
- 29. Come verificare se un file è stato creato da pickle?
- 30. rilevare se un oggetto è vuoto
'setNumCapabilities 2' e controlla che 'getNumCapabilities' restituisca 1? – Yuras