2010-02-19 32 views
26

Có khả năng biên dịch các thư viện BOOST trong chế độ nhận biết luồng. Nếu vậy bạn sẽ thấy "...- mt ..." xuất hiện trong tên thư viện. Tôi không thể hiểu những gì nó mang lại cho tôi và khi nào tôi cần phải sử dụng chế độ như vậy? Nó có cho tôi bất kỳ lợi ích nào không?Thư viện BOOST trong chế độ nhận biết đa luồng

Hơn thế nữa, tôi thực sự bối rối khi có thư viện BOOST Threads được biên dịch trong chế độ NO-thread-aware (không có -mt trong tên). Nó không có ý nghĩa gì đối với tôi. Có vẻ tự mâu thuẫn:/

Cảm ơn bạn rất nhiều vì đã trợ giúp!

Trả lời

0

Tôi không phải là một guru Boost, nhưng tôi cho rằng nó là thế này:

Trong một môi trường MT, bất kỳ dữ liệu toàn cầu hay chia sẻ có thể có nhiều hơn một thread cố gắng để truy cập vào nó cùng một lúc, mà có thể dẫn đến tham nhũng dữ liệu. Một đối tượng MT-aware sẽ sử dụng đồng bộ hóa (Critical Section, Mutexes, vv) để đảm bảo rằng chỉ có một luồng có thể truy cập dữ liệu tại một thời điểm.

Có thể có các chức năng trong thư viện Chuỗi chỉ chạy mà vẫn hoạt động trong các chương trình đơn luồng. Ngoài ra, các chức năng có thể giải quyết thành không có chức năng (không có chức năng vô hại) để chương trình tương tự có thể được biên dịch với MT (và chức năng tăng hoạt động) hoặc Đơn luồng (và chức năng tăng không làm gì) mà không phải thay đổi mã.

+1

Có, điều đó có ý nghĩa. Tuy nhiên tôi vẫn còn nhầm lẫn với thực tế tôi có thư viện chủ đề không có -mt trong tên của nó.Họ nói 'biến thể SINGLE_THREADED của dự án boost_thread bị tắt'. nhưng tôi không có - libboost_thread.so.1.42.0 - trong thư mục của tôi. Có lỗi hay tôi đã làm gì sai? – musthero

3

MT cho phép hỗ trợ đa luồng trong thư viện tăng cường nghĩa là bạn an toàn khi sử dụng chúng trong các chương trình đa luồng của bạn (ít nhất là từ điểm mã nội bộ của thư viện).

Và thực sự xây dựng thư viện chủ đề trong chế độ "không có chủ đề" không có ý nghĩa gì nhưng tôi đã bị ấn tượng rằng mục tiêu xây dựng cụ thể đó bị vô hiệu hóa.

Kiểm tra những hiểu

http://sodium.resophonic.com/boost-cmake/current-docs/build_variants.html

http://www.boost.org/doc/libs/1_41_0/more/getting_started/windows.html#library-naming

+0

Cảm ơn, Mario. Nó hữu ích! Tuy nhiên tôi vẫn không biết làm thế nào tôi có thể biên dịch thư viện chủ đề mà không có '-mt' nếu nó được kích hoạt mặc định để biên dịch trong chế độ này chỉ (đây là những gì tôi có trong thư mục lib của tôi - libboost_thread.so.1.42.0). Tôi chỉ làm theo hướng dẫn từ trang web BOOST. – musthero

18

Bởi vì bạn không nói rõ làm thế nào bạn đã xây dựng được, và về những gì nền tảng, tôi sẽ giải thích toàn bộ câu chuyện. Cả hai trên Linux và Windows, thư viện Boost.Thread được xây dựng trong chế độ MT. Trên Windows, theo mặc định, bạn nhận được hậu tố -mt cho nó. Trên Linux, theo mặc định trong 1,42, bạn không nhận được hậu tố. Lý do bạn không nhận được hậu tố trên Linux là khá nhiều không có thư viện nào khác sử dụng quy ước như vậy, và nó ít quan trọng hơn nhiều đối với Linux.

Điều này có làm rõ mọi thứ không?

+0

Theo những gì bạn đang nói, quy ước đặt tên trong 1,42 đã được thay đổi. Thật vậy, điều này phù hợp với những gì tôi thấy. Nó có phải là một quy ước nổi bật từ bây giờ không? (Tôi có nghĩa là không có -mt trong tên trên Linux) Cảm ơn Vladimir! – musthero

+0

Có, từ giờ trở đi xây dựng với các tùy chọn mặc định trên Linux sẽ tạo ra các thư viện không có -mt. –

+1

Sau đó, làm thế nào để bạn phân biệt các thư viện nhận biết luồng từ các thư viện thông thường? –

2

Bạn có thể tạo Boost với hỗ trợ đa luồng hoặc không (luồng = đa | đơn). Boost.Thread buộc xây dựng thư viện bằng cách thiết lập luồng = đa trong Jamfile của nó (tương đương bjam của Makefile).

Vì vậy, độc lập với việc bạn có yêu cầu hỗ trợ luồng hay không, Boost.Thread luôn cung cấp. Do đó bạn có thể tìm thấy cả hai tên.

15

Có một tùy chọn để đặt "-MT" hậu tố lại (bjam --layout=tagged)

--layout=<layout>  Determines whether to choose library names 
         and header locations such that multiple 
         versions of Boost or multiple compilers can 
         be used on the same system. 

          versioned - Names of boost binaries 
          include the Boost version number, name and 
          version of the compiler and encoded build 
          properties. Boost headers are installed in a 
          subdirectory of <HDRDIR> whose name contains 
          the Boost version number. 

          tagged -- Names of boost binaries include the 
          encoded build properties such as variant and 
          threading, but do not including compiler name 
          and version, or Boost version. This option is 
          useful if you build several variants of Boost, 
          using the same compiler. 

          system - Binaries names do not include the 
          Boost version number or the name and version 
          number of the compiler. Boost headers are 
          installed directly into <HDRDIR>. This option 
          is intended for system integrators who are 
          building distribution packages. 

         The default value is 'versioned' on Windows, and 
         'system' on Unix. 
1

Kể từ khi, dưới Linux, phiên bản-MT là aliased/ràng buộc với phiên bản thường, nó làm cho không có sự khác biệt. Trong một hệ thống vanilla hiện đại, cả hai đều được bao gồm một cách đơn giản để dễ biên dịch.

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