22

我不知道为什么这不起作用

#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++ 问题

4

6 回答 6

37

您应该将线程 main 声明为:

void* print_message(void*) // takes one parameter, unnamed if you aren't using it
于 2009-07-16T07:39:06.727 回答
19

因为主线程退出了。

在主线程中休眠。

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;
}
于 2009-07-16T07:37:47.400 回答
3

使用 G++ 编译时,请记住放置 -lpthread 标志 :)

于 2009-07-16T07:40:41.700 回答
3

从 pthread 函数原型:

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

传递给 pthread_create 的函数必须有一个原型

void* name(void *arg)
于 2009-07-16T07:46:31.643 回答
2

这对我有用:

#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;
}
于 2009-07-16T07:59:38.543 回答
0

连锁。试试这个:

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

于 2009-07-16T07:45:40.457 回答