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 }
回答
檢查返回代碼。
if ((retcode = pthread_create(&threadID, Null, run_thread_function,arguments)) != 0)
{
//something went wrong
}
檢查pthread_create
函數的返回碼是否有錯誤。
更新一些共享變量並從另一個線程進行測試。請記住在更新共享變量時使用同步原語,例如互斥體。或者爲了進行簡單的測試,用線程ID或其他類型的標識符打印一些消息。
我不明白 - 如果你打算使用OS同步原語(比如互斥量,但不是互斥量:),爲什麼還要花費在輪詢共享變量?爲什麼不從新線程發出一些事件/信號/變化信號? –
是的,這也是可能的。 – phoxis
傳遞一個同步對象(condvar,event或semaphore)作爲參數的一部分。在調用pthread_create()之後等待它。在線程中,在第一行發出信號(或者在線程執行了init的東西之後,如果這是你想要實現的)。
你也可以考慮使用屏障。 – Brady
使用C++ 11,通過類型爲std::thread
的對象創建線程在新線程啓動之前不會返回。
如果您想確定您的新線程是否已經開始,請使用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;
}
- 1. 如何在開始執行其他功能之前完成功能執行
- 2. Javascript驗證功能未執行
- 3. apex始終執行驗證
- 4. 如何讓一個線程等待並執行另一個?
- 5. 驗證並執行公式?
- 6. 上一個功能運行完成後執行一個功能
- 7. 執行並行線程池
- 8. 如何測試驗證特定功能是否執行
- 9. 硒網格,測試開始在同一線程並行運行時開始
- 10. 爲什麼線程在另一個線程開始執行時會停止?
- 11. 如何在另一個功能完成後執行功能?
- 12. 如何在完成第一個功能後執行功能?
- 13. 2功能並排執行
- 14. 並行線程功能 「_np」 後綴
- 15. CUDA。如何展開前32個線程,以便它們並行執行?
- 16. 綁定功能,所以當一個執行另一個執行
- 17. 開始執行
- 18. 如何開始在WPF應用程序中執行計時器功能
- 19. 將執行從一個線程移動到另一個線程以執行任務並行和調用
- 20. 讀取一個文件並根據行內容執行功能
- 21. 我如何執行功能?
- 22. 同時開始的兩個並行請求一個接一個地執行
- 23. 如何讓紅寶石線程執行我選擇的功能?
- 24. 執行功能,有條件和並行
- 25. 異步和並行執行的功能
- 26. 如何並行執行一個函數?
- 27. Passport身份驗證始終執行failureRedirect
- 28. 如何等待當前線程執行,並執行其他線程completedly
- 29. 在執行PostExecution後,doInBackground中的AsycTask線程開始運行
- 30. 如何在另一個線程組中執行線程組?
這是否真正達到什麼OP要求? –
是的,上面的語句/檢查只是保證創建一個線程而不是執行它!我對後者感興趣 – user1789710