  The transition from single-core to multi-core processors has made
multi-threaded software an important subject in computer aided verification.
Here, we describe and evaluate an extension of the ESBMC model checker to
support the verification of multi-threaded software with shared variables and
locks using bounded model checking (BMC) based on Satisfiability Modulo
Theories (SMT). We describe three approaches to model check multi-threaded
software and our modelling of the synchronization primitives of the Pthread
library. In the lazy approach, we generate all possible interleavings and call
the BMC procedure on each of them individually, until we either find a bug, or
have systematically explored all interleavings. In the schedule recording
approach, we encode all possible interleavings into one single formula and then
exploit the high speed of the SMT solvers. In the underapproximation-widening
approach, we reduce the state space by abstracting the number of state
variables and interleavings from the proofs of unsatisfiability generated by
the SMT solvers. In all three approaches, we use partial-order reduction (POR)
techniques to reduce the number of interleavings explored. Experiments show
that our approaches can analyze larger problems and substantially reduce the
verification time compared to state-of-the-art techniques that combine classic
POR methods with symbolic algorithms and others that implement the
Counter-Example Guided Abstraction Refinement technique.
