2013-05-22 33 views
6

thay vì sizeof(std::atomic<bool>)==1?Tại sao sizeof (std :: mutex) == 40 (gcc, clang, icc)?

Một mutex có thể được thực hiện thông qua một đơn giản std::atomic<bool>, vì vậy tôi sẽ nghĩ rằng kích thước của một mutex có thể là nhỏ như vậy, hoặc có lẽ 4 (32bits).

+0

"Một mutex có thể được thực hiện thông qua một đơn giản' std :: nguyên tử '" không có nghĩa là đó là triển khai tối ưu. –

+2

'nguyên tử ' là một người đàn ông nghèo 'mutex' ... Ý tôi là, ** thực sự ** người đàn ông nghèo. – Griwes

+3

Tôi tự hỏi tại sao một số xem xét câu hỏi này không rõ ràng hay không hữu ích. –

Trả lời

11

Với một bool bạn chỉ có thể thực hiện khóa xoay. Lưu ý rằng nó sẽ là một khóa không công bằng bởi vì không có gì đảm bảo rằng người phục vụ xếp hàng, vì vậy có một cơ hội mà dưới ganh đua cao nhất trong một trường hợp cực đoan có thể bị chặn mãi mãi bởi vì nó sẽ luôn luôn mất cuộc đua để có được khóa.

Việc triển khai mutex cần hỗ trợ từ hệ điều hành để có thể đặt các chuỗi chờ lên ngủ. Vì vậy, một mutex sẽ cần một lá cờ nói cho dù đó là bị khóa và một số hình thức của một bộ mô tả hàng đợi cho phép đặt chủ đề chờ đợi để ngủ và đánh thức chúng. Nếu bạn muốn mutex có thể hỗ trợ khóa đệ quy, mạnh mẽ, quay tùy chọn, bảo vệ đảo ngược ưu tiên, vv .., nó sẽ cần nhiều thành viên hơn nữa.

+0

Nhưng với một nguyên tử 'int' và một hệ thống gọi như' futex' trên Linux, bạn có thể thực hiện một mutex thích hợp. –

+0

@MikeSeymour Không thực sự. –

+0

Bạn có nghĩa là "Không, bạn không thể", hoặc "Không thực sự, vì bạn đang sử dụng một số bộ nhớ hạt nhân cũng như không gian người dùng' int' "? Tôi sẽ không đồng ý nếu bạn là người đầu tiên. –

11

Thư viện GNU thường sử dụng các chuỗi Posix để triển khai thư viện chuỗi tiêu chuẩn. Điều đó sử dụng một loại pthread_mutex_t để đại diện cho một số loại mutex khác nhau; do đó, nó chứa các trường khác nhau cần thiết cho các mutex phức tạp hơn (ví dụ: bộ đếm cho các mutex đệ quy), cộng với một trường để xác định loại.

Bạn nói đúng, về nguyên tắc, với sự hỗ trợ thích hợp từ hệ điều hành, std::mutex có thể sử dụng ít nhất một byte bộ nhớ người dùng. (Trên Linux, nó phải là một int; và trên các nền tảng khác, nó có thể là một số nguyên hoặc xử lý có kích thước con trỏ tới một tài nguyên hạt nhân). Có lẽ, những lợi ích của việc sử dụng một thực hiện được thử nghiệm hiện có được coi là lớn hơn những lợi ích của việc tiết kiệm vài chục byte cho mỗi mutex.

6

Một mutex có thể được thực hiện thông qua một đơn giản std::atomic<bool>

Nó không giống như một khả năng, xem xét rằng mutex::lock là một hoạt động cần thiết, và std::atomic<bool> rất có thể là một loại phi khóa. Bạn có thể đặt một vòng lặp while xung quanh cuộc gọi compare_exchange_strong, nhưng điều đó không giống như mutex::lock, bởi vì nó lãng phí CPU trong toàn bộ thời gian chờ.

Nói chung, std::mutex phức tạp hơn nhiều so với đơn giản bool với hành vi đa luồng được xác định, giải thích kích thước khá lớn, phụ thuộc vào trình biên dịch: ví dụ: on ideone the sizeof(mutex) is 24.

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