2013-03-10 16 views
6

Im sử dụng studio trực quan 2012 và C++ 11. Tôi không hiểu tại sao điều này không làm việc:std :: thread C++. Nhiều chủ đề hơn cùng một dữ liệu

void client_loop(bool &run) 
{ 
    while (run); 
} 

int main() 
{ 
    bool running = true; 
    std::thread t(&client_loop,std::ref(running)); 

    running = false ; 
    t.join(); 
} 

Trong trường hợp này, các vòng lặp của thread t không bao giờ kết thúc nhưng tôi explicity thiết running-false. runrunning có cùng vị trí. Tôi đã cố gắng đặt running là một biến toàn cầu duy nhất nhưng không có gì xảy ra. Tôi đã cố gắng vượt qua một giá trị con trỏ quá nhưng không có gì.

Chủ đề sử dụng cùng một đống. Tôi thực sự không hiểu. Ai giúp tôi với?

+0

Chương trình của bạn chấm dứt quá sớm để có thể quan sát bất kỳ điều gì thú vị. –

+0

nope, tôi quên viết trong ví dụ này "t.join()" .. :) –

+0

nếu bạn đặt 'running' là' volatile' thì sao? – didierc

Trả lời

11

Chương trình của bạn có Hành vi không xác định, vì nó giới thiệu cuộc đua dữ liệu trên biến số running (một chủ đề viết nó, một chuỗi khác đọc nó).

Bạn nên sử dụng một mutex để đồng bộ hóa truy cập, hoặc làm cho running một atomic<bool>:

#include <iostream> 
#include <thread> 
#include <atomic> 

void client_loop(std::atomic<bool> const& run) 
{ 
    while (run.load()); 
} 

int main() 
{ 
    std::atomic<bool> running(true); 
    std::thread t(&client_loop,std::ref(running)); 

    running = false ; 
    t.join(); 

    std::cout << "Arrived"; 
} 

Xem live example làm việc.

+0

cảm ơn bạn, tôi (ngớ ngẩn) nghĩ rằng không cần đề phòng nếu chuỗi thứ hai chỉ đọc dữ liệu .. Tôi không biết biến "nguyên tử": Nhưng bây giờ tôi đã phát hiện ra rất hạnh phúc. cảm ơn lần nữa –

+0

+1 Tôi đã học được điều gì đó ngày hôm nay. – didierc

+0

@MatteoGaleotti Nó thậm chí có thể đã làm việc trên các kiến ​​trúc hợp lý (mặc dù vẫn là UB, tất nhiên), đã không vòng lặp vô hạn này được đơn giản chỉ được tối ưu hóa ra ngoài. –

0

const có thể không ảnh hưởng đến chế độ xem của trình biên dịch mã. Trong một ứng dụng đơn luồng, giá trị sẽ không thay đổi (và chương trình đặc biệt này là vô nghĩa). Trong một ứng dụng đa luồng, vì nó là một loại nguyên tử, trình biên dịch không thể tối ưu hóa tải, vì vậy trên thực tế không có vấn đề thực sự ở đây. Nó thực sự là một vấn đề của phong cách; kể từ main sửa đổi giá trị và client_loop tìm kiếm sửa đổi đó, có vẻ như không đúng khi tôi nói rằng giá trị là const.

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