The library usually ensures that there are enough LWPs in its pool for a program to proceed.
When all the LWPs in the process are blocked in indefinite waits (such as blocked reading from a tty or network), the operating environment sends the new signal, SIGWAITING, to the process. This signal is handled by the threads library. When the process contains a thread that is waiting to run, a new LWP is created and the appropriate waiting thread is assigned to it for execution.
The SIGWAITING mechanism does not ensure that an additional LWP is created when one or more threads are compute bound and another thread becomes runnable. A compute-bound thread can prevent multiple runnable threads from being started because of a shortage of LWPs.
This can be prevented by calling thr_setconcurrency(3THR). While using thr_setconcurrency() with POSIX threads is not POSIX compliant, its use is recommended to avoid LWP shortages for unbound threads in some computationally intensive situations. (The only way to be completely POSIX compliant and avoid LWP shortages is to create only PTHREAD_SCOPE_SYSTEM bound threads.)
See "Thread Concurrency (Solaris Threads Only)" for more information about using the thr_setconcurrency(3T) function.
In Solaris threads, you can also use THR_NEW_LWP in calls to thr_create(3THR) to create another LWP.