2011-10-28 19 views
6

Tôi gặp vấn đề với thư viện tăng cường. Tôi đang sử dụng MinGW với gcc 4.5.2 để biên dịch đoạn mã sau:Tăng thời gian làm việc dưới MinGW không phải là chủ đề an toàn

unsigned long GetEpochSeconds() 
{ 
    using namespace boost::posix_time; 
    using namespace boost::gregorian; 

    ptime now(second_clock::universal_time()); 
    ptime epoch(date(1970,1,1)); 
    time_duration diff = now-epoch; 
    return diff.total_seconds(); 
} 

Vấn đề là mã này không được thread-safe. Khi tôi chạy nó từ bên trong nhiều luồng, ứng dụng của tôi bị treo. Bây giờ tôi đã chuyển đổi thành các hàm chuẩn c như thời gian, mktime, v.v. và mọi thứ hoạt động tốt, nhưng trong tương lai tôi sẽ cần một vài hàm thời gian tăng cường.

Tôi cũng đang biên dịch với -D_REENTRANT, nhưng điều này không hữu ích.

Cảm ơn mọi đề xuất.

+0

bạn đã biên dịch mọi thứ với '-threads' chưa? – rubenvb

+0

Tôi đã thử nhưng không có kết quả. – kappa

+0

Bạn có thể bọc nó trong một mutex nếu hit hiệu suất không phải là quá lớn. – sje397

Trả lời

2

Kiểm tra xem mã của bạn có đang gọi gmtime() hay gmtime_r() (sử dụng trình gỡ lỗi cho mục này). Xem http://www.boost.org/doc/libs/1_48_0/boost/date_time/c_time.hpp và lưu ý rằng BOOST_DATE_TIME_HAS_REENTRANT_STD_FUNCTIONS phải được xác định để nhận được thời gian an toàn cho chuỗi.

+0

Nó thực sự buồn/xấu mà việc thực hiện không sử dụng 'localtime_s' và' gmtime_s' trong Visual Studio ... – dalle

+0

@ dalle: Tôi không biết nhiều về lập trình Windows, nhưng điều thú vị là họ thậm chí đi đến sự cố khi tắt cảnh báo trình biên dịch để sử dụng các hàm không phải _s. Tại sao bạn không gửi bản vá hoặc ít nhất đề xuất thay đổi trong danh sách gửi thư Boost? –

+1

Nhìn vào mã các hàm 'localtime' và' gmtime' thông thường là các luồng an toàn sử dụng thư viện Visual Studio CRT. Chúng không reentrant, nhưng mỗi thread sử dụng bộ đệm 'struct tm' bên trong. – dalle

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