2011-09-28 38 views
6

Tôi có nhiều chủ đề đọc cùng một biến int. và một chuỗi đang viết giá trị.Có an toàn để đọc từ nhiều luồng không?

Tôi không quan tâm đến điều kiện chủng tộc.

chỉ mối quan tâm của tôi là viết và đọc giá trị int cùng một lúc là bộ nhớ có an toàn không?

và nó sẽ không dẫn đến bất kỳ sự cố ứng dụng nào.

+0

có thể trùng lặp của [Là C++ Đọc và Viết của một nguyên tử int] (http://stackoverflow.com/questions)/54188/are-c-đọc-và-viết-of-an-int-nguyên tử) – Sjoerd

Trả lời

4

Có, điều đó sẽ ổn thôi. Cách duy nhất tôi có thể hình dung rằng đâm là nếu một trong các chủ đề deallocates bộ nhớ sao lưu số nguyên đó. Để có kết quả tốt nhất, tôi cũng sẽ đảm bảo các số nguyên được căn chỉnh tại các ranh giới sizeof(int). (Một số CPU không thể truy cập vào các số nguyên mà không có sự liên kết này. Những người khác cung cấp sự đảm bảo yếu hơn về nguyên tử để truy cập chưa được ký.)

+1

đảm bảo các số nguyên được căn chỉnh theo sizeof (int) bạn có thể vui lòng cung cấp thêm thông tin về cách tôi có thể thực hiện điều đó không? –

+0

@VivekGoel Trong hầu hết các trường hợp, trình biên dịch của bạn sẽ làm điều đó cho bạn. Nhưng có những cách trình biên dịch cụ thể để thực hiện điều này, tức là '__attribute __ ((aligned (4)))' cho GCC. – asveikau

+0

@VivekGoel - Bạn cũng có thể làm những việc để kiểm tra điều này khi chạy, tức là '((uintptr_t) & x)% sizeof (int)' phải bằng 0. (Và bạn thậm chí có thể thêm một 'khẳng định' cho điều đó.) – asveikau

0

Trên tất cả các nền tảng Linux mà tôi biết, đọc và viết của liên kết int là nguyên tử và an toàn. Bạn sẽ không bao giờ đọc một giá trị mà không được viết (không có từ rách). Bạn sẽ không bao giờ gây ra lỗi hoặc sự cố.

+0

Tôi nghĩ rằng loại tuyên bố rộng này thực sự cần một tham chiếu. Ngoài ra, chính xác _what_ có liên kết có nghĩa là gì trong ngữ cảnh này? – sehe

+0

Nếu ai đó không biết số nguyên liên kết là gì, họ không có kinh doanh viết các chương trình đa luồng. –

+0

oh thực sự quyến rũ. Ngoài ra, cách quá tổng quát. Vâng, tất nhiên, bạn không cần phải bận tâm. Có những câu trả lời khác về SO làm sáng tỏ nhiều hơn. – sehe

2

Có, trên x86 và x86-64, miễn là giá trị bạn đang đọc được căn chỉnh chính xác. 32-bit int s, chúng cần được căn chỉnh trên một ranh giới 4 byte để truy cập là atomic khi đọc hoặc viết, hầu như luôn luôn xảy ra trừ khi bạn đi ra ngoài để tạo ra các số int s chưa được gán (nói , bằng cách sử dụng một cấu trúc đóng gói hoặc bằng cách làm số học/con trỏ với bộ đệm byte).

Bạn cũng có thể muốn khai báo biến của mình là volatile để trình biên dịch sẽ tạo mã sẽ tìm nạp lại biến từ bộ nhớ mỗi khi được truy cập. Điều đó sẽ ngăn không cho nó tối ưu hóa chẳng hạn như lưu vào bộ đệm trong một thanh ghi khi nó có thể bị thay đổi bởi một luồng khác.

+0

+1 cho biến động và thực sự đề cập đến mô đun liên kết – sehe

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