2015-10-18 133 views
4

我想创建无功能参数的线程,但我不断收到正在认真地缠着我的错误,因为我不能得到的东西超级简单的工作权pthread_create没有参数?

继承人我的代码:

#include<stdio.h> 
#include<array> 
#include<pthread.h> 
#include<fstream> 
#include<string> 

void *showart(NULL); 

int main(int argc, char** argv){ 
    pthread_t thread1; 
    pthread_create(&thread1, NULL, showart, NULL); 
    getchar(); 
    return 0; 
} 

void *showart(NULL) 
{ 
    std::string text; 
    std::ifstream ifs("ascii"); 
    while(!ifs.eof()) 
    { 
     std::getline(ifs,text); 
     printf(text.c_str()); 
    } 
} 

它使错误:

main.cpp:11:50: error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’ [-fpermissive] 

回答

3

您的函数必须匹配pthread。这意味着它需要拿回并返回一个void*。改为使用void* showart(void*);

0

线程函数的声明和定义都不正确。当调用它时,可以使用NULL,但该参数的类型是声明/定义所需的,为void *

因此,你需要这样的东西:

void *showart(void *);    // declaration 
void *showart(void *unused) { ... } // definition 

换句话说,这将这样的伎俩:

#include<stdio.h> 
#include<array> 
#include<pthread.h> 
#include<fstream> 
#include<string> 

void *showart (void *); 

int main (int argc, char **argv) { 
    pthread_t thread1; 
    pthread_create (&thread1, NULL, showart, NULL); 
    getchar(); 
    return 0; 
} 

void *showart (void *unused) { 
    std::string text; 
    std::ifstream ifs("ascii"); 
    while(!ifs.eof()) { 
     std::getline (ifs, text); 
     printf ("%s\n", text.c_str()); 
    } 
} 

虽然你也许应该考虑让你的代码变得更健壮,例如检查来自pthread_create()的返回码,加入main()内的线程,检查以确保文件存在等等。

+1

您不需要在定义中命名'unused',这可以避免在某些编译器配置下获得未使用的警告。 – kfsone