示例:
void start(void) { pthread_create(&threadID, Null, run_thread_function,arguments); //is there a way to ensure if the run_thread_function(basically new thread) started //execution before returning from this(start) function }
答案 0 :(得分:4)
检查返回代码。
if ((retcode = pthread_create(&threadID, Null, run_thread_function,arguments)) != 0)
{
//something went wrong
}
答案 1 :(得分:4)
将同步对象(condvar,event或semaphore)作为参数的一部分传递。在调用pthread_create()之后等待它。在线程中,在第一行发出信号,(或者在线程执行了它的初始化之后,如果这是你想要实现的)。
答案 2 :(得分:3)
检查pthread_create
函数的返回码是否有错误。
更新一些共享变量并从另一个线程测试它。请记住在更新共享变量时使用同步原语,如互斥锁。
或者进行简单测试,使用线程ID或其他类型的标识符打印一些消息。
答案 3 :(得分:0)
使用C ++ 11,在新线程启动之前,通过类型为std::thread
的对象创建线程不会返回。
答案 4 :(得分: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;
}