diff --git a/gexec/session.go b/gexec/session.go
index d213b07..1dd5068 100644
--- a/gexec/session.go
+++ b/gexec/session.go
@@ -215,13 +215,7 @@
 }
 
 var trackedSessions = []*Session{}
-
-/*
-Resets the sessions tracked by gexec after Run is called.
-*/
-func ResetTrackedSessions() {
-	trackedSessions = []*Session{}
-}
+var trackedSessionsMutex = &sync.Mutex{}
 
 /*
 Kill sends a SIGKILL signal to all the processes started by Run, and waits for them to exit.
@@ -230,6 +224,8 @@
 If any of the processes already exited, KillAndWait returns silently.
 */
 func KillAndWait(timeout ...interface{}) {
+	trackedSessionsMutex.Lock()
+	defer trackedSessionsMutex.Unlock()
 	for _, session := range trackedSessions {
 		session.Kill().Wait(timeout...)
 	}
@@ -242,6 +238,8 @@
 If any of the processes already exited, TerminateAndWait returns silently.
 */
 func TerminateAndWait(timeout ...interface{}) {
+	trackedSessionsMutex.Lock()
+	defer trackedSessionsMutex.Unlock()
 	for _, session := range trackedSessions {
 		session.Terminate().Wait(timeout...)
 	}
@@ -254,6 +252,8 @@
 If any of the processes already exited, Kill returns silently.
 */
 func Kill() {
+	trackedSessionsMutex.Lock()
+	defer trackedSessionsMutex.Unlock()
 	for _, session := range trackedSessions {
 		session.Kill()
 	}
@@ -266,6 +266,8 @@
 If any of the processes already exited, Terminate returns silently.
 */
 func Terminate() {
+	trackedSessionsMutex.Lock()
+	defer trackedSessionsMutex.Unlock()
 	for _, session := range trackedSessions {
 		session.Terminate()
 	}
@@ -278,6 +280,8 @@
 If any of the processes already exited, Signal returns silently.
 */
 func Signal(signal os.Signal) {
+	trackedSessionsMutex.Lock()
+	defer trackedSessionsMutex.Unlock()
 	for _, session := range trackedSessions {
 		session.Signal(signal)
 	}
@@ -290,6 +294,8 @@
 If any of the processes already exited, Interrupt returns silently.
 */
 func Interrupt() {
+	trackedSessionsMutex.Lock()
+	defer trackedSessionsMutex.Unlock()
 	for _, session := range trackedSessions {
 		session.Interrupt()
 	}
diff --git a/gexec/session_test.go b/gexec/session_test.go
index 173be8d..5a7af74 100644
--- a/gexec/session_test.go
+++ b/gexec/session_test.go
@@ -128,7 +128,10 @@
 	})
 
 	Context("tracking sessions", func() {
-		BeforeEach(ResetTrackedSessions)
+		BeforeEach(func() {
+			KillAndWait()
+		})
+
 		Describe("kill", func() {
 			It("should kill all the started sessions, and not wait", func() {
 				session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter)
@@ -256,28 +259,6 @@
 				Eventually(session3).Should(Exit(128 + 2))
 			})
 		})
-
-		Describe("reset", func() {
-			It("should not track process before the reset", func() {
-				session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter)
-				Ω(err).ShouldNot(HaveOccurred())
-				defer func() { session1.Kill().Wait() }()
-
-				ResetTrackedSessions()
-
-				session2, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter)
-				Ω(err).ShouldNot(HaveOccurred())
-
-				session3, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter)
-				Ω(err).ShouldNot(HaveOccurred())
-
-				KillAndWait()
-
-				Ω(session1).ShouldNot(Exit(), "Should not have exited")
-				Ω(session2).Should(Exit(128+9), "Should have exited")
-				Ω(session3).Should(Exit(128+9), "Should have exited")
-			})
-		})
 	})
 
 	Context("when the command exits", func() {
