Простой pthread! C ++ - PullRequest
       13

Простой pthread! C ++

20 голосов
/ 16 июля 2009

Понятия не имею, почему это не работает

#include <iostream>
#include <pthread.h>
using namespace std;

void *print_message(){

    cout << "Threading\n";
}



int main() {

    pthread_t t1;

    pthread_create(&t1, NULL, &print_message, NULL);
    cout << "Hello";

    return 0;
}

Ошибка:

[Описание, Ресурс, Путь, Местоположение, Тип] Инициализирующий аргумент 3 int pthread_create (pthread_t *, const pthread_attr_t *, void * (*) (void *), void *) 'threading.cpp threading / src line 24 C / C ++ Проблема

Ответы [ 6 ]

36 голосов
/ 16 июля 2009

Вы должны объявить основной поток как:

void* print_message(void*) // takes one parameter, unnamed if you aren't using it
18 голосов
/ 16 июля 2009

Поскольку основной поток завершается.

Поставь сон в основную ветку.

cout << "Hello";
sleep(1);

return 0;

Стандарт POSIX не определяет, что происходит при выходе из основного потока.
Но в большинстве реализаций это приведет к смерти всех порожденных потоков.

Таким образом, в главном потоке вы должны подождать, пока поток не умрет, прежде чем выйти В этом случае самое простое решение - просто спать и дать возможность другому потоку выполнить. В реальном коде вы бы использовали pthread_join ();

#include <iostream>
#include <pthread.h>
using namespace std;

#if defined(__cplusplus)
extern "C"
#endif
void *print_message(void*)
{
    cout << "Threading\n";
}



int main() 
{
    pthread_t t1;

    pthread_create(&t1, NULL, &print_message, NULL);
    cout << "Hello";

    void* result;
    pthread_join(t1,&result);

    return 0;
}
2 голосов
/ 16 июля 2009

Это сработало для меня:

#include <iostream>
#include <pthread.h>
using namespace std;

void* print_message(void*) {

    cout << "Threading\n";
}

int main() {

    pthread_t t1;

    pthread_create(&t1, NULL, &print_message, NULL);
    cout << "Hello";

    // Optional.
    void* result;
    pthread_join(t1,&result);
    // :~

    return 0;
}
2 голосов
/ 16 июля 2009

Из прототипа функции pthread:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
    void *(*start_routine)(void*), void *arg);

Функция, переданная в pthread_create, должна иметь прототип

void* name(void *arg)
0 голосов
/ 16 июля 2009

рычажный механизм. Попробуйте это:

extern "C" void *print_message() {...

0 голосов
/ 16 июля 2009

При компиляции с G ++ не забудьте поставить флаг -lpthread:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...