2012-02-29 32 views
5

Tôi có một chương trình chạy hai hoạt động khác nhau và tôi muốn chia sẻ các biến giữa chúng.C++, cách chia sẻ dữ liệu giữa các quy trình hoặc chủ đề

Hiện tại, tôi đang sử dụng chuỗi thay vì quy trình ngã ba nhưng tôi đang gặp sự cố khi chia sẻ biến ngay cả khi tôi tuyên bố chúng là dễ bay hơi.

tôi đã cố gắng với đẩy mạnh thực hiện:

boost::thread collisions_thread2(boost::bind(function_thread2); 

bằng cách tuyên bố các biến được chia sẻ như không ổn định, nhưng có vẻ như function_thread2() chức năng không có khả năng nhìn thấy những thay đổi trên các biến chia sẻ.

gì tôi muốn làm là một cái gì đó như:

thread1: 

while(true){ 
//..do somet stuff 
check variable1 
} 

thread2: 

while(true){ 
do some other stuff 
check and write on variable1 
} 

Bạn có thể gợi ý cho tôi một hướng dẫn hoặc một phương pháp để dễ dàng chia sẻ biến giữa các chủ đề? Có thể tăng thư viện có thể hữu ích trong trường hợp này không? Bạn có nghĩ nên sử dụng fork() tốt hơn không?

Tôi biết rằng tôi phải sử dụng mutex để tránh các tình huống quan trọng, nhưng tôi chưa bao giờ sử dụng nó.

+0

Kiểm tra xem [câu hỏi này] (http://stackoverflow.com/questions/118199/c-thread-shared-data) giúp. Và cuối cùng [Boost Thread Synchronization] (http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html) – jweyrich

+0

dễ bay hơi không liên quan gì đến chủ đề –

+0

Bạn thậm chí không cần ' dễ bay hơi để chia sẻ các biến. Biến toàn cục được chia sẻ theo mặc định. Nhưng đây là một điều xấu vì nó làm cho việc tạo ra các cuộc đua dữ liệu trở nên dễ dàng. Khi bạn có các cuộc đua dữ liệu, bạn không thể mong đợi chương trình của bạn hoạt động hợp lý, vì vậy có thể bạn đang chạy vào một số điều này. Bạn cần phải đăng thêm mã thực của mình để được trợ giúp chẩn đoán các cuộc đua dữ liệu. – bames53

Trả lời

2

Nếu bạn có thể sử dụng boost, bạn có thể sử dụng boost::mutex.

// mtx should be shared for all of threads. 
boost::mutex mtx; 

// code below for each thread 
{ 
    boost::mutex::scoped_lock lk(mtx); 
    // do something 
} 
2

Nếu sử dụng thư viện phát tán posix (mà tôi khuyên dùng) thì hãy sử dụng pthread_mutex_t.

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 

Sau đó, trong mỗi chủ đề khi bạn muốn đồng bộ hóa truy cập dữ liệu:

pthread_mutex_lock(&lock); 
//access the data 
pthread_mutex_unlock(&lock); 
1

bất kỳ loại khóa hoặc mở khóa mutex nào đều hoạt động. Theo như câu hỏi của bạn về biến động đi, từ khóa này là một thực hành tốt, đặc biệt là trong các chương trình đa luồng như của bạn. Nhưng nó không ảnh hưởng đến cách bạn khóa và mở khóa. dễ bay hơi chỉ đơn giản là yêu cầu trình biên dịch không tối ưu hóa biến cho ví dụ: bằng cách đặt nó vào sổ đăng ký. Dưới đây là một lời giải thích rất tốt:

http://drdobbs.com/cpp/184403766

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