0

例子:

无效开始(无效)
{
   pthread_create(&threadID, Null, run_thread_function,arguments);

   //有没有办法确保run_thread_function(基本上是新线程)是否启动   
   //从this(start)函数返回之前执行    

}
4

5 回答 5

4

检查返回码。

if ((retcode = pthread_create(&threadID, Null, run_thread_function,arguments)) != 0)
{
   //something went wrong
}
于 2012-10-31T21:01:15.550 回答
4

传递同步对象(condvar、事件或信号量)作为参数的一部分。在调用 pthread_create() 之后等待它。在线程中,在第一行发出信号,(或者在线程执行了它的初始化内容之后,如果这是你想要实现的)。

于 2012-10-31T21:02:20.577 回答
3

检查pthread_create函数的返回码是否有错误。

更新一些共享变量并从另一个线程测试它。请记住在更新共享变量时使用同步原语,例如互斥锁。

或者为了进行简单的测试,打印一些带有线程 ID 或其他类型标识符的消息。

于 2012-10-31T21:01:16.160 回答
0

在 C++11 中,通过类型对象创建线程std::thread在新线程启动之前不会返回。

于 2012-10-31T22:12:02.253 回答
0

如果pthread_barrier_wait您想确定您的新线程已经开始,请使用。

不过,我真的很怀疑那些非常关心这一点的代码。好像你在询问比赛条件。

请注意,我应该检查所有地方的返回值,而不是为了简洁明了。

#include <iostream>
#include <pthread.h>
#include <unistd.h>

void *newthread(void *vbarrier)
{
   pthread_barrier_t *barrier = static_cast<pthread_barrier_t *>(vbarrier);
   sleep(2);
   int err = pthread_barrier_wait(barrier);
   if ((err != 0) && (err != PTHREAD_BARRIER_SERIAL_THREAD)) {
      ::std::cerr << "Aiee! pthread_barrier_wait returned some sort of error!\n";
   } else {
      ::std::cerr << "I am the new thread!\n";
   }
   return 0;
}

int main()
{
   pthread_barrier_t barrier;
   pthread_barrier_init(&barrier, NULL, 2);
   pthread_t other;
   pthread_create(&other, NULL, newthread, &barrier);
   pthread_barrier_wait(&barrier);
   ::std::cerr << "Both I and the new thread reached the barrier.\n";
   pthread_join(other, NULL);
   return 0;
}

C++11 没有障碍。但是在一定程度上,使用条件变量可以很容易地模拟障碍:

#include <thread>
#include <condition_variable>
#include <iostream>
#include <unistd.h>

void runthread(::std::mutex &m, ::std::condition_variable &v, bool &started)
{
   sleep(2);
   {
      ::std::unique_lock< ::std::mutex> lock(m);
      started = true;
      v.notify_one();
   }
   ::std::cerr << "I am the new thread!\n";
}

int main()
{
   ::std::mutex m;
   ::std::condition_variable v;
   bool started = false;
   ::std::thread newthread(runthread, ::std::ref(m), ::std::ref(v), ::std::ref(started));
   {
      ::std::unique_lock< ::std::mutex> lock(m);
      while (!started) {
         v.wait(lock);
      }
   }
   ::std::cerr << "Both I and the new thread are running.\n";
   newthread.join();
   return 0;
}
于 2012-11-02T00:11:43.390 回答