  To support growing massive parallelism, functional components and also the
capabilities of current processors are changing and continue to do so. Todays
computers are built upon multiple processing cores and run applications
consisting of a large number of threads, making runtime thread management a
complex process. Further, each core can support multiple, concurrent thread
execution. Hence, hardware and software support for threads is more and more
needed to improve peak-performance capacity, overall system throughput, and has
therefore been the subject of much research. This paper surveys, many of the
proposed or currently available solutions for executing, distributing and
managing threads both in hardware and software. The nature of current
applications is diverse. To increase the system performance, all programming
models may not be suitable to harness the built-in massive parallelism of
multicore processors. Due to the heterogeneity in hardware, hybrid programming
model (which combines the features of shared and distributed model) currently
has become very promising. In this paper, first, we have given an overview of
threads, threading mechanisms and its management issues during execution. Next,
we discuss about different parallel programming models considering to their
explicit thread support. We also review the programming models with respect to
their support to shared-memory, distributed-memory and heterogeneity. Hardware
support at execution time is very crucial to the performance of the system,
thus different types of hardware support for threads also exist or have been
proposed, primarily based on widely used programming models. We also further
discuss on software support for threads, to mainly increase the deterministic
behavior during runtime. Finally, we conclude the paper by discussing some
common issues related to the thread management.
