Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^6: threads->create hangs (vs fork)

by BrowserUk (Pope)
on Aug 16, 2015 at 19:34 UTC ( #1138769=note: print w/replies, xml ) Need Help??


in reply to Re^5: threads->create hangs (vs fork)
in thread threads->create hangs

I'm sorry, but the implentation you describe was not released until 2002.

Really? Then how do you account for all the pthread references in this code from Perl 5005 released 1998:

#ifdef USE_THREADS #ifdef WIN32 # include <win32thread.h> #else #ifndef DJGPP /* POSIXish threads */ #ifdef OLD_PTHREADS_API # define pthread_mutexattr_init(a) pthread_mutexattr_create(a) # define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np( +a,t) # define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destruc +tor_t)(d)) # define YIELD pthread_yield() # define DETACH(t) \ STMT_START { \ if (pthread_detach(&(t)->self)) { \ MUTEX_UNLOCK(&(t)->mutex); \ croak("panic: DETACH"); \ } \ } STMT_END #else # define pthread_mutexattr_default NULL # define pthread_condattr_default NULL #endif /* OLD_PTHREADS_API */ #endif #endif #ifdef PTHREADS_CREATED_JOINABLE # define ATTR_JOINABLE PTHREAD_CREATE_JOINABLE #else # ifdef PTHREAD_CREATE_UNDETACHED # define ATTR_JOINABLE PTHREAD_CREATE_UNDETACHED # else # define ATTR_JOINABLE PTHREAD_CREATE_JOINABLE # endif #endif #ifndef YIELD # ifdef HAS_SCHED_YIELD # define YIELD sched_yield() # else # ifdef HAS_PTHREAD_YIELD # define YIELD pthread_yield() # endif # endif #endif #ifndef MUTEX_INIT #define MUTEX_INIT(m) \ STMT_START { \ if (pthread_mutex_init((m), pthread_mutexattr_default)) \ croak("panic: MUTEX_INIT"); \ } STMT_END #define MUTEX_LOCK(m) \ STMT_START { \ if (pthread_mutex_lock((m))) \ croak("panic: MUTEX_LOCK"); \ } STMT_END #define MUTEX_UNLOCK(m) \ STMT_START { \ if (pthread_mutex_unlock((m))) \ croak("panic: MUTEX_UNLOCK"); \ } STMT_END #define MUTEX_DESTROY(m) \ STMT_START { \ if (pthread_mutex_destroy((m))) \ croak("panic: MUTEX_DESTROY"); \ } STMT_END #endif /* MUTEX_INIT */ #ifndef COND_INIT #define COND_INIT(c) \ STMT_START { \ if (pthread_cond_init((c), pthread_condattr_default)) \ croak("panic: COND_INIT"); \ } STMT_END #define COND_SIGNAL(c) \ STMT_START { \ if (pthread_cond_signal((c))) \ croak("panic: COND_SIGNAL"); \ } STMT_END #define COND_BROADCAST(c) \ STMT_START { \ if (pthread_cond_broadcast((c))) \ croak("panic: COND_BROADCAST"); \ } STMT_END #define COND_WAIT(c, m) \ STMT_START { \ if (pthread_cond_wait((c), (m))) \ croak("panic: COND_WAIT"); \ } STMT_END #define COND_DESTROY(c) \ STMT_START { \ if (pthread_cond_destroy((c))) \ croak("panic: COND_DESTROY"); \ } STMT_END #endif /* COND_INIT */ /* DETACH(t) must only be called while holding t->mutex */ #ifndef DETACH #define DETACH(t) \ STMT_START { \ if (pthread_detach((t)->self)) { \ MUTEX_UNLOCK(&(t)->mutex); \ croak("panic: DETACH"); \ } \ } STMT_END #endif /* DETACH */ #ifndef JOIN #define JOIN(t, avp) \ STMT_START { \ if (pthread_join((t)->self, (void**)(avp))) \ croak("panic: pthread_join"); \ } STMT_END #endif /* JOIN */ #ifndef SET_THR #define SET_THR(t) \ STMT_START { \ if (pthread_setspecific(PL_thr_key, (void *) (t))) \ croak("panic: pthread_setspecific"); \ } STMT_END #endif /* SET_THR */ #ifndef THR # ifdef OLD_PTHREADS_API struct perl_thread *getTHR _((void)); # define THR getTHR() # else # define THR ((struct perl_thread *) pthread_getspecific(PL_thr_key +)) # endif /* OLD_PTHREADS_API */ #endif /* THR */ /* * dTHR is performance-critical. Here, we only do the pthread_get_spec +ific * if there may be more than one thread in existence, otherwise we get + thr * from thrsv which is cached in the per-interpreter structure. * Systems with very fast pthread_get_specific (which should be all sy +stems * but unfortunately isn't) may wish to simplify to "...*thr = THR". */ #ifndef dTHR # define dTHR \ struct perl_thread *thr = PL_threadnum? THR : (struct perl_thread* +)SvPVX(PL_thrsv) #endif /* dTHR */ #ifndef INIT_THREADS # ifdef NEED_PTHREAD_INIT # define INIT_THREADS pthread_init() # else # define INIT_THREADS NOOP # endif #endif /* Accessor for per-thread SVs */ #define THREADSV(i) (thr->threadsvp[i]) /* * LOCK_SV_MUTEX and UNLOCK_SV_MUTEX are performance-critical. Here, w +e * try only locking them if there may be more than one thread in exist +ence. * Systems with very fast mutexes (and/or slow conditionals) may wish +to * remove the "if (threadnum) ..." test. */ #define LOCK_SV_MUTEX \ STMT_START { \ if (PL_threadnum) \ MUTEX_LOCK(&PL_sv_mutex); \ } STMT_END #define UNLOCK_SV_MUTEX \ STMT_START { \ if (PL_threadnum) \ MUTEX_UNLOCK(&PL_sv_mutex); \ } STMT_END #ifndef THREAD_RET_TYPE # define THREAD_RET_TYPE void * # define THREAD_RET_CAST(p) ((void *)(p)) #endif /* THREAD_RET */ /* Values and macros for thr->flags */ #define THRf_STATE_MASK 7 #define THRf_R_JOINABLE 0 #define THRf_R_JOINED 1 #define THRf_R_DETACHED 2 #define THRf_ZOMBIE 3 #define THRf_DEAD 4 #define THRf_DID_DIE 8 /* ThrSTATE(t) and ThrSETSTATE(t) must only be called while holding t- +>mutex */ #define ThrSTATE(t) ((t)->flags & THRf_STATE_MASK) #define ThrSETSTATE(t, s) STMT_START { \ (t)->flags &= ~THRf_STATE_MASK; \ (t)->flags |= (s); \ DEBUG_L(PerlIO_printf(PerlIO_stderr(), \ "thread %p set to state %d\n", (t), (s))); \ } STMT_END typedef struct condpair { perl_mutex mutex; /* Protects all other fields */ perl_cond owner_cond; /* For when owner changes at all */ perl_cond cond; /* For cond_signal and cond_broadcast */ Thread owner; /* Currently owning thread */ } condpair_t; #define MgMUTEXP(mg) (&((condpair_t *)(mg->mg_ptr))->mutex) #define MgOWNERCONDP(mg) (&((condpair_t *)(mg->mg_ptr))->owner_cond) #define MgCONDP(mg) (&((condpair_t *)(mg->mg_ptr))->cond) #define MgOWNER(mg) ((condpair_t *)(mg->mg_ptr))->owner #else /* USE_THREADS is not defined */ #define MUTEX_LOCK(m) #define MUTEX_UNLOCK(m) #define MUTEX_INIT(m) #define MUTEX_DESTROY(m) #define COND_INIT(c) #define COND_SIGNAL(c) #define COND_BROADCAST(c) #define COND_WAIT(c, m) #define COND_DESTROY(c) #define LOCK_SV_MUTEX #define UNLOCK_SV_MUTEX #define THR /* Rats: if dTHR is just blank then the subsequent ";" throws an error + */ #ifdef WIN32 #define dTHR extern int Perl___notused #else #define dTHR extern int errno #endif #endif /* USE_THREADS */

And this from perl 5.6.0 released March 2000:

See the README.threads in the main perl 5.004_xx development distribution (x >= 50) for details of how to build and use this. If all else fails, read on. If your version of patch can't create a file from scratch, then you'll need to create an empty thread.h manually first. Perl itself will nee +d to be built with -DUSE_THREADS yet. If you're using MIT pthreads or another threads package that needs pthread_init() to be called, then add -DNEED_PTHREAD_INIT. If you're using a threads library that only follows one of the old POSIX drafts, then you'll probably need to add -DOLD_PTHREADS_API. I haven't tested -DOLD_PTHREADS_API properly yet and I think you may still have to tweak a couple of the mutex calls to follow the old API. This extension is copyright Malcolm Beattie 1995-1997 and is freely distributable under your choice of the GNU Public License or the Artistic License (see the main perl distribution). Malcolm Beattie mbeattie@sable.ox.ac.uk

The only way in which you are right -- and its a stretch -- is that the first attempt at providing threading in Perl -- the one above; which also used OS kernel threading: pthreads on *nix and OS threads on Windows and OS/2 -- was "very experimental" and was immediately replace by the iThreads implementation.

Update: Caveat: assuming it is reliable enough. However, in regard to "clearly have nothing useful...please refrain" On second thoughts, someone with such arrogance is an unsafe contributor to the docs. To teach, one must first sincerely have sufficient character to learn.

I'm very capable of learning; just not from people who make shit up and pass it off as knowledge.

And if you want to challenge that conclusion and "educate me"; then simply post a link to the authoritative place where you learnt that: "So Perl boldly went and implemented (interpreter-based) threads (i.e. without OS support),"

What you take as "arrogance" is simply 'well founded and proven knowledge'. Ie. The knowledge to see through BS.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
In the absence of evidence, opinion is indistinguishable from prejudice.
I'm with torvalds on this Agile (and TDD) debunked I told'em LLVM was the way to go. But did they listen!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1138769]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (2)
As of 2020-10-21 22:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My favourite web site is:












    Results (224 votes). Check out past polls.

    Notices?