2013-04-17 29 views

Trả lời

7

UPDATE: Jonathan Wakely vui lòng xem xét vấn đề này một he says (below in comments) rằng -pthread có được thông qua cho cả trình biên dịch và các mối liên kết . Nếu tôi làm điều đó mã không thất bại với gcc 4.7.2 hoặc. Vì vậy, câu trả lời dường như không liên quan gì đến e-mail được trích dẫn. Cảm ơn Jonathan!


Dưới đây là một số dấu ngoặc kép thẳng thành nhà phát triển gcc Jonathan Wakely's mail, được viết vào năm 2011:

Tất cả các toán tử so sánh trên std :: của chúng tôi chủ đề :: id dựa vào hành vi undefined bởi vì thread của chúng ta :: id chỉ là một pthread_t.

[...]

2) toán tử == sử dụng được pthread_equal, mà là undefined cho hợp lệ ID chủ đề, POSIX nói:

If either t1 or t2 are not valid thread IDs, the behavior is undefined. 
Mặc dù nó đã được viết cách đây hai năm , nó có thể vẫn áp dụng. Hiện tại tôi không thể kiểm tra mã nguồn gcc để nói nhiều hơn.

Weird. Các mã sau đây:

#include <iostream> 
#include <thread> 

int main() { 

    std::cout << "Started" << std::endl; 

    std::thread::id nobody; 

    if (nobody != std::this_thread::get_id()) { 

     std::cout << "OK" << std::endl; 
    } 

    std::cout << "Finished" << std::endl; 
} 

sản xuất:

Started 
OK 
Finished 

Kiểm tra here. Tuy nhiên, mã của bạn không thành công với 4.7.2.

+1

Nó chỉ thất bại với 4.7.2 nếu bạn không chuyển '-pthread' đến trình biên dịch và trình liên kết. Có lẽ 'pthread_equal' luôn trả về true khi bạn không liên kết đến' libpthread.so', tôi đoán đó là lỗi trong ' ', vì vậy tôi nên sửa nó –

+2

Để rõ ràng, tôi không nghĩ rằng đây là bất cứ điều gì để làm với thư bạn trích dẫn, nó phải làm với cố gắng sử dụng 'std :: thread' và không liên kết với' -pthread' –

+0

@JonathanWakely Vâng, bây giờ tôi nhận được điều đó, tôi cập nhật câu trả lời ngay lập tức. – Ali

6

Tôi không có quyền truy cập vào các tiêu chuẩn C++ 11 nhưng từ dự thảo tiêu chuẩn mới nhất n3485 [thread.thread.id]

Một đối tượng của loại chủ đề :: id cung cấp một fi er identi duy nhất cho mỗi sợi thực hiện và một giá trị khác biệt duy nhất cho tất cả các đối tượng chủ đề đó không đại diện cho một sợi thực hiện (30.3.1)

tiếp theo

id() noexce pt; E ff ects: Xây dựng một đối tượng của loại id. Postconditions: Đối tượng được xây dựng không đại diện cho một luồng thực thi.

này dường như ngụ ý rằng những gì bạn đang quan sát là một lỗi trong gcc

Các vấn đề liên quan