2017-02-14 17 views
0
#include <pthread.h> 
#include <iostream> 

using namespace std; 

void OnCreateThread() 
{ 
    cout << "Create a thread." << endl; 
} 

void OnExitThread() 
{ 
    cout << "Exit a thread." << endl; 
} 

void f(void*) {} 

int main() 
{ 
    // 
    // What to do here ??? 
    // 
    pthread_t dummy; 
    pthread_create(&dummy, 0, f, 0); 
    pthread_create(&dummy, 0, f, 0); 
    while (true); 
} 

код создает две собственные потоки, кроме std::thread, и я хочу его вывести следующим образом:Как вызвать функцию при создании и выходе потока?

Create a thread. 
Create a thread. 
Exit a thread. 
Exit a thread. 

Это может быть сделано под Windows, с помощью функции FlsXXX.

Однако я не знаю, можно ли это сделать в Linux.

Есть ли стандартный способ под Linux?

+0

Вы хотите знать, как использовать 'pthread_create', или вы хотите знать, как получить желаемый результат? – Chad

+0

Вы найдете все функции потоков, задокументированные на странице [pthreads (7)] (http://manpages.courier-mta.org//htmlman7/pthreads.7.html). Если он не зарегистрирован там, его не существует. Ответ здесь, в буквальном смысле, RTFM. –

+0

Если вы не можете зарегистрировать эти функции, вы все равно можете скрыть pthread_create. Я просто шучу... – felix

ответ

1

Как вызвать функцию при создании и выходе потока?

API Pthreads не предоставляет обратные вызовы для создания потоков (а также std::thread API).

Решение довольно просто: вызовите функции в начале и конце обратного вызова start_routine.

void* f(void*) { 
    OnCreateThread(); 
    OnExitThread(); 
    return nullptr; 
} 

В случае, если вы можете OnExitThread называть даже тогда, когда поток был прекращен досрочно, вы можете захотеть использовать pthread_cleanup_push, чтобы зарегистрировать его в качестве обратного вызова.


PS. Обратный вызов start_routine должен вернуть void*.

1

Существует функция по крайней мере pthread_cleanup_push, которая позволяет вам добавить функцию, которая будет вызываться сразу после завершения потока. Никогда не слышал об этом для создания, но некоторые API могут иметь такие.