0

例:

ボイドスタート(ボイド)
{
   pthread_create(&threadID, Null, run_thread_function,arguments);

   //run_thread_function (基本的には新しいスレッド) が開始されたかどうかを確認する方法はありますか   
   //this(start)関数から戻る前に実行    

}
4

5 に答える 5

4

引数の一部として同期オブジェクト (condvar、イベント、またはセマフォ) を渡します。pthread_create() を呼び出した後、それを待ちます。スレッドでは、最初の行でそれを通知します (または、それが達成しようとしている場合は、スレッドが初期化を実行した後)。

于 2012-10-31T21:02:20.577 に答える
4

戻りコードを確認してください。

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

関数の戻りコードでpthread_createエラーを確認してください。

一部の共有変数を更新し、別のスレッドからテストします。共有変数を更新するときは、mutex などの同期プリミティブを使用することを忘れないでください。

または、簡単なテストを行うには、スレッド 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 に答える