]> git.sesse.net Git - stockfish/blobdiff - src/thread.cpp
Don't need pthread_detach() after pthread_join()
[stockfish] / src / thread.cpp
index 1f01537ffd2845ca311b509300eddedb5c9f899e..ac0be89fdcaee7766bbe8a3ede5765f90d7c691f 100644 (file)
@@ -27,23 +27,23 @@ ThreadsManager Threads; // Global object definition
 namespace { extern "C" {
 
  // start_routine() is the C function which is called when a new thread
- // is launched. It simply calls idle_loop() of the supplied threadID.
+ // is launched. It simply calls idle_loop() of the supplied thread.
  // There are two versions of this function; one for POSIX threads and
  // one for Windows threads.
 
 #if defined(_MSC_VER)
 
-  DWORD WINAPI start_routine(LPVOID threadID) {
+  DWORD WINAPI start_routine(LPVOID thread) {
 
-    Threads[*(int*)threadID].idle_loop(NULL);
+    ((Thread*)thread)->idle_loop(NULL);
     return 0;
   }
 
 #else
 
-  void* start_routine(void* threadID) {
+  void* start_routine(void* thread) {
 
-    Threads[*(int*)threadID].idle_loop(NULL);
+    ((Thread*)thread)->idle_loop(NULL);
     return NULL;
   }
 
@@ -63,9 +63,8 @@ void Thread::wake_up() {
 }
 
 
-// cutoff_occurred() checks whether a beta cutoff has occurred in
-// the thread's currently active split point, or in some ancestor of
-// the current split point.
+// cutoff_occurred() checks whether a beta cutoff has occurred in the current
+// active split point, or in some ancestor of the split point.
 
 bool Thread::cutoff_occurred() const {
 
@@ -148,11 +147,6 @@ void ThreadsManager::set_size(int cnt) {
 
 void ThreadsManager::init() {
 
-  // Threads will go to sleep as soon as created, only main thread is kept alive
-  set_size(1);
-  threads[0].state = Thread::SEARCHING;
-  threads[0].threadID = 0;
-
   // Initialize threads lock, used when allocating slaves during splitting
   lock_init(&threadsLock);
 
@@ -166,22 +160,28 @@ void ThreadsManager::init() {
           lock_init(&(threads[i].splitPoints[j].lock));
   }
 
-  // Create and startup all the threads but the main that is already running
+  // Initialize main thread's associated data
+  threads[0].state = Thread::SEARCHING;
+  threads[0].threadID = 0;
+  set_size(1); // This makes all the threads but the main to go to sleep
+
+  // Create and launch all the threads but the main that is already running,
+  // threads will go immediately to sleep.
   for (int i = 1; i < MAX_THREADS; i++)
   {
       threads[i].state = Thread::AVAILABLE;
       threads[i].threadID = i;
 
 #if defined(_MSC_VER)
-      threads[i].handle = CreateThread(NULL, 0, start_routine, (LPVOID)&threads[i].threadID, 0, NULL);
+      threads[i].handle = CreateThread(NULL, 0, start_routine, (LPVOID)&threads[i], 0, NULL);
       bool ok = (threads[i].handle != NULL);
 #else
-      bool ok = (pthread_create(&threads[i].handle, NULL, start_routine, (void*)&threads[i].threadID) == 0);
+      bool ok = (pthread_create(&threads[i].handle, NULL, start_routine, (void*)&threads[i]) == 0);
 #endif
 
       if (!ok)
       {
-          std::cout << "Failed to create thread number " << i << std::endl;
+          std::cerr << "Failed to create thread number " << i << std::endl;
           ::exit(EXIT_FAILURE);
       }
   }
@@ -205,7 +205,6 @@ void ThreadsManager::exit() {
           CloseHandle(threads[i].handle);
 #else
           pthread_join(threads[i].handle, NULL);
-          pthread_detach(threads[i].handle);
 #endif
       }