2015-10-18 2 views
4

Я хочу создать поток без каких-либо функциональных аргументов, но я получаю ошибки, которые серьезно прослушивал меня, потому что я не могу получить что-то супер просто для того чтобы работать правильноpthread_create без аргументов?

Heres мой код:

#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 one. Это значит, что нужно взять и вернуть 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