2009-07-16 39 views
16

Tôi không có ý tưởng tại sao điều này không làm việcĐơn giản pthread! C++

#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; 
} 

Lỗi:

[Description, Resource, Path, Location, Type] initializing argument 3 of 'int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)' threading.cpp threading/src line 24 C/C++ Problem

Trả lời

30

Bạn nên khai báo chính chủ đề như:

void* print_message(void*) // takes one parameter, unnamed if you aren't using it 
+0

Thats ý tưởng tôi không muốn đặt đó như là một tham số ... cách trên làm việc –

+3

Đây là câu trả lời đúng. Câu hỏi ban đầu đã được định dạng sai, vì vậy anh ta đã nhận được thông báo lỗi sai (thiếu một vài dấu hoa thị, được lấy làm đánh dấu in nghiêng). Tôi đã sửa nó ngay bây giờ. –

+2

Không quan trọng bạn muốn *, 'pthread_create' lấy một con trỏ tới một hàm nhận' void * 'làm tham số và trả về' void * '. Nó đã được xác định API cho thập kỷ (s). :) Bạn không buộc phải sử dụng nó mặc dù. –

17

Bởi vì các lối ra chủ đề chính.

Đặt giấc ngủ vào sợi chính.

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

return 0; 

Tiêu chuẩn POSIX không chỉ định điều gì sẽ xảy ra khi thoát khỏi luồng chính.
Nhưng trong hầu hết các lần triển khai, điều này sẽ làm cho tất cả các luồng sinh sản bị chết.

Vì vậy, trong chủ đề chính, bạn nên đợi cho đến khi chuỗi bị chết trước khi thoát. Trong trường hợp này, giải pháp đơn giản nhất là chỉ để ngủ và cung cấp cho các chủ đề khác một cơ hội để thực thi. Trong mã thực, bạn sẽ sử dụng 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; 
} 
+1

nope nguyên nhân tôi có pthread_join (t1) ở cuối trước khi trở về 0. Cộng với nó cho tôi xây dựng lỗi và không lỗi thời gian chạy :( –

+0

cũng không thực sự ... gây ra print_message mất một đối số .. Không muốn nó để có một đối số –

+0

Bạn ninja đã sửa lỗi xây dựng nhưng không viết về nó, sau đó tiếp tục nói về một vấn đề khác mà anh ta sẽ gặp phải. Bạn đã bị đánh dấu xuống vì ai đó (không phải tôi) không bắt được bản sửa lỗi đó. –

0

Khi biên dịch với G ++, hãy nhớ đặt cờ -lpthread :)

+0

Tôi nghĩ rằng có thể là vấn đề nhưng im sử dụng eclipse bất kỳ ý tưởng nơi để thêm nó –

+0

Chỉ cần nhận thấy ive đã làm điều đó. : D nếu không nó sẽ không biên dịch các fthread funcs –

0

Linkage. Hãy thử điều này:

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

+0

Điều này là sai bởi vì bất kể mangling tên, đi qua một con trỏ hàm sẽ vượt qua địa chỉ chính xác của hàm. – Vortico

2

Từ chức năng pthread nguyên mẫu:

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

Các hàm được chuyển vào pthread_create phải có một nguyên mẫu của

void* name(void *arg) 
+0

Câu trả lời của Loki đã tuyên bố điều này (trước đó 9 phút) –

2

này đã làm việc cho tôi:

#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

Bạn vừa sao chép câu trả lời từ Loki? – data