answer Đỗ Quốc Hùng · Đỗ Quốc Hùng 18:13 17/09/2008 Họ KHÔNG phải là điều tương tự. Chúng được sử dụng cho các mục đích khác nhau! Các ngữ nghĩa loại trừ lẫn nhau Các ngữ nghĩa loại trừ Một semaphore Mutex được "sở hữu" bởi nhiệm vụ đảm nhận nó. Nếu Nhiệm vụ B cố gắng semGive một mutex hiện đang được thực hiện bởi Nhiệm vụ A, cuộc gọi của Nhiệm vụ B sẽ trả về lỗi và không thành công. Mutexes luôn sử dụng trình tự sau: - Bán kết - Phần quan trọng - SemGiveĐây là một ví dụ đơn giản: Chủ đề A Chủ đề B Lấy Mutex truy cập dữ liệu ... Lấy Mutex <== Sẽ chặn ... Cung cấp dữ liệu truy cập Mutex <== Unblocks ... Tặng MutexSemaphore
Lưu ý rằng với một semaphore nhị phân, B có thể lấy semaphore và A để cung cấp cho nó. 632 hữu ích 5 bình luận chia sẻ answer Trịnh Thùy My · Trịnh Thùy My 19:53 06/12/2008 Ví dụ về Nhà vệ sinh là một sự tương tự thú vị:
416 hữu ích 5 bình luận chia sẻ answer Lý Thùy Dung · Lý Thùy Dung 13:29 15/09/2008 Mutex chỉ có thể được phát hành bởi luồng đã thu được nó, trong khi bạn có thể báo hiệu semaphore từ bất kỳ luồng nào khác (hoặc quá trình), vì vậy semaphores phù hợp hơn cho một số vấn đề đồng bộ hóa như nhà sản xuất-người tiêu dùng. Trên Windows, semaphores nhị phân giống như các đối tượng sự kiện hơn là mutexes. 411 hữu ích 5 bình luận chia sẻ answer Trịnh Bảo Tiên · Trịnh Bảo Tiên 05:22 09/10/2009 Những bài viết hay về chủ đề này: Từ phần 2:
138 hữu ích 5 bình luận chia sẻ answer Dương Cao Sơn · Dương Cao Sơn 05:33 21/11/2013 Vì không có câu trả lời nào ở trên xóa được sự nhầm lẫn, đây là câu trả lời cho sự nhầm lẫn của tôi.
Nguồn: http://www.geekforgeek.org/mutex-vs-semaphore/ 91 hữu ích 0 bình luận chia sẻ answer Nguyễn Ðông Nhi · Nguyễn Ðông Nhi 18:23 24/09/2008 Ngữ nghĩa đồng bộ hóa của chúng rất khác nhau:
Như vậy, người ta có thể thấy một mutex như một mã thông báo được truyền từ nhiệm vụ này sang nhiệm vụ khác và một semaphore là đèn đỏ giao thông (nó báo hiệu cho ai đó rằng nó có thể tiến hành). 37 hữu ích 0 bình luận chia sẻ answer Hồ Mai Thu · Hồ Mai Thu 18:05 20/06/2013
35 hữu ích 0 bình luận chia sẻ answer Hoàng Bảo Vy · Hoàng Bảo Vy 18:58 22/11/2008 Ở cấp độ lý thuyết, chúng không khác nhau về mặt ngữ nghĩa. Bạn có thể thực hiện một mutex bằng semaphores hoặc ngược lại (xem ví dụ ở đây ). Trong thực tế, việc thực hiện là khác nhau và họ cung cấp các dịch vụ hơi khác nhau. Sự khác biệt thực tế (về các dịch vụ hệ thống xung quanh chúng) là việc triển khai một mutex nhằm mục đích trở thành một cơ chế đồng bộ hóa nhẹ hơn. Trong oracle-speak, mutexes được gọi là chốt và semaphores được gọi là chờ đợi . Ở cấp độ thấp nhất, họ sử dụng một số loại thử nghiệm nguyên tử và cơ chế thiết lập . Điều này đọc giá trị hiện tại của một vị trí bộ nhớ, tính toán một số loại điều kiện và viết ra một giá trị tại vị trí đó trong một lệnh duy nhất không thể bị gián đoạn . Điều này có nghĩa là bạn có thể có được một mutex và kiểm tra xem có ai khác có nó trước bạn không. Một triển khai mutex điển hình có một quy trình hoặc luồng thực hiện lệnh test-and-set và đánh giá xem có thứ gì khác đã đặt mutex không. Một điểm quan trọng ở đây là không có tương tác với bộ lập lịch , vì vậy chúng tôi không có ý tưởng (và không quan tâm) người đã đặt khóa. Sau đó, chúng tôi hoặc từ bỏ lát cắt thời gian của mình và thử lại khi tác vụ được lên lịch lại hoặc thực hiện khóa xoay . Khóa xoay là một thuật toán như: Count down from 5000: i. Execute the test-and-set instruction ii. If the mutex is clear, we have acquired it in the previous instruction so we can exit the loop iii. When we get to zero, give up our time slice.Khi chúng tôi thực hiện xong mã được bảo vệ của chúng tôi (được gọi là phần quan trọng ), chúng tôi chỉ đặt giá trị mutex thành 0 hoặc bất cứ điều gì có nghĩa là 'rõ ràng'. Nếu nhiều tác vụ đang cố gắng để có được mutex, thì tác vụ tiếp theo sẽ được lên lịch sau khi mutex được phát hành sẽ có quyền truy cập vào tài nguyên. Thông thường, bạn sẽ sử dụng các mutexes để kiểm soát tài nguyên được đồng bộ hóa trong đó chỉ cần truy cập độc quyền trong khoảng thời gian rất ngắn, thông thường để thực hiện cập nhật lên cấu trúc dữ liệu được chia sẻ. Một semaphore là một cấu trúc dữ liệu được đồng bộ hóa (thường sử dụng một mutex) có số đếm và một số trình bao bọc cuộc gọi hệ thống tương tác với bộ lập lịch ở độ sâu hơn một chút so với các thư viện mutex. Semaphores được tăng lên và giảm dần và được sử dụng để chặn các nhiệm vụ cho đến khi một cái gì đó khác đã sẵn sàng. Xem Vấn đề về Nhà sản xuất / Người tiêu dùng để biết ví dụ đơn giản về điều này. Semaphores được khởi tạo cho một số giá trị - một semaphore nhị phân chỉ là một trường hợp đặc biệt trong đó semaphore được khởi tạo thành 1. Đăng lên một semaphore có tác dụng đánh thức một quá trình chờ đợi. Một thuật toán semaphore cơ bản trông giống như: (somewhere in the program startup) Initialise the semaphore to its start-up value. Acquiring a semaphore i. (synchronised) Attempt to decrement the semaphore value ii. If the value would be less than zero, put the task on the tail of the list of tasks waiting on the semaphore and give up the time slice. Posting a semaphore i. (synchronised) Increment the semaphore value ii. If the value is greater or equal to the amount requested in the post at the front of the queue, take that task off the queue and make it runnable. iii. Repeat (ii) for all tasks until the posted value is exhausted or there are no more tasks waiting.Trong trường hợp một semaphore nhị phân, sự khác biệt thực tế chính giữa hai là bản chất của các dịch vụ hệ thống xung quanh cấu trúc dữ liệu thực tế. EDIT: Như evan đã chỉ ra một cách đúng đắn, spinlocks sẽ làm chậm một bộ vi xử lý. Bạn sẽ chỉ sử dụng một spinlock trên hộp đa bộ xử lý vì trên một bộ xử lý duy nhất, quá trình giữ mutex sẽ không bao giờ thiết lập lại nó trong khi một tác vụ khác đang chạy. Spinlocks chỉ hữu ích trên các kiến trúc đa bộ xử lý. 21 hữu ích 2 bình luận chia sẻ answer Bùi Nhật Quốc · Bùi Nhật Quốc 06:17 24/08/2014 Mặc dù mutex & semaphores được sử dụng làm nguyên thủy đồng bộ hóa, có một sự khác biệt lớn giữa chúng. Trong trường hợp của mutex, chỉ có luồng bị khóa hoặc có được mutex mới có thể mở khóa nó. Trong trường hợp của một semaphore, một luồng chờ trên semaphore có thể được báo hiệu bởi một luồng khác. Một số hệ điều hành hỗ trợ sử dụng mutex & semaphores giữa tiến trình. Thông thường sử dụng là tạo ra trong bộ nhớ chia sẻ. 18 hữu ích 1 bình luận chia sẻ answer Lê Hạnh Trang · Lê Hạnh Trang 12:29 15/10/2008 Trên Windows, có hai sự khác biệt giữa mutexes và semaphores nhị phân:
10 hữu ích 1 bình luận chia sẻ answer Vũ Thi Yến · Vũ Thi Yến 16:18 11/12/2012 Bạn rõ ràng sử dụng mutex để khóa dữ liệu trong một luồng được truy cập bởi một luồng khác cùng một lúc. Giả sử rằng bạn vừa gọi lock()và đang trong quá trình truy cập dữ liệu. Điều này có nghĩa là bạn không mong đợi bất kỳ luồng nào khác (hoặc một phiên bản khác của cùng mã luồng) truy cập vào cùng một dữ liệu bị khóa bởi cùng một mutex. Đó là, nếu đó là cùng một mã luồng được thực thi trên một thể hiện luồng khác, chạm vào khóa, thìlock()nên chặn dòng điều khiển ở đó. Điều này áp dụng cho một luồng sử dụng một mã luồng khác, cũng đang truy cập cùng một dữ liệu và cũng bị khóa bởi cùng một mutex. Trong trường hợp này, bạn vẫn đang trong quá trình truy cập dữ liệu và bạn có thể mất 15 giây nữa để mở khóa mutex (để luồng khác bị chặn trong khóa mutex sẽ bỏ chặn và sẽ cho phép điều khiển truy cập dữ liệu). Bạn có bằng bất cứ giá nào cho phép một luồng khác chỉ mở khóa cùng một mutex không, và lần lượt, cho phép các luồng đã chờ (chặn) trong khóa mutex để bỏ chặn và truy cập dữ liệu? Hy vọng bạn có những gì tôi đang nói ở đây? Theo, đồng ý theo định nghĩa phổ quát!,
Vì vậy, nếu bạn rất đặc biệt về việc sử dụng semaphore nhị phân thay vì mutex, thì bạn nên hết sức cẩn thận trong phạm vi phạm vi khóa và khóa. Ý tôi là, mọi luồng điều khiển chạm vào mọi khóa đều phải thực hiện một cuộc gọi mở khóa, cũng không nên có bất kỳ khóa mở khóa đầu tiên nào, thay vào đó, nó phải luôn luôn là khóa đầu tiên. 10 hữu ích 0 bình luận chia sẻ answer Phạm Ngọc Anh · Phạm Ngọc Anh 19:55 17/05/2013 Mutex được sử dụng cho "Cơ chế khóa". một quá trình tại một thời điểm có thể sử dụng tài nguyên được chia sẻ trong khi Semaphores được sử dụng cho "Cơ chế báo hiệu" như "Tôi đã hoàn thành, bây giờ có thể tiếp tục" 10 hữu ích 0 bình luận chia sẻ answer Đặng Thu Phong · Đặng Thu Phong 14:54 06/08/2017 Mutex: Giả sử chúng ta có chủ đề phần quan trọng mà T1 muốn truy cập thì nó sẽ thực hiện theo các bước dưới đây. T1:
Semaphore nhị phân: Nó hoạt động dựa trên tín hiệu chờ đợi và tín hiệu. chờ (s) giảm giá trị "s" xuống một giá trị "s" thường được khởi tạo với giá trị "1", tín hiệu tăng giá trị "s" lên một. nếu giá trị "s" là 1 có nghĩa là không ai đang sử dụng phần quan trọng, khi giá trị bằng 0 có nghĩa là phần quan trọng đang được sử dụng. giả sử luồng T2 đang sử dụng phần quan trọng thì nó sẽ thực hiện theo các bước dưới đây. T2:
Sự khác biệt chính giữa Mutex và Baph semaphore là trong Mutext nếu luồng khóa phần quan trọng thì nó phải mở khóa phần quan trọng, không có luồng nào khác có thể mở khóa nó, nhưng trong trường hợp semaphore nhị phân nếu một luồng khóa phần quan trọng sử dụng chức năng Wait (s) thì giá trị của s trở thành "0" và không ai có thể truy cập nó cho đến khi giá trị của "s" trở thành 1 nhưng giả sử một số tín hiệu gọi luồng khác thì giá trị của "s" trở thành 1 và nó cho phép chức năng khác sử dụng phần quan trọng. do đó trong chủ đề semaphore nhị phân không có quyền sở hữu. 10 hữu ích 0 bình luận chia sẻ answer Huỳnh Nam Phi · Huỳnh Nam Phi 23:54 29/05/2014 Quan niệm: Vài bài báo nói rằng "semaphore nhị phân và mutex giống nhau" hoặc "Semaphore với giá trị 1 là mutex" nhưng sự khác biệt cơ bản là Mutex chỉ có thể được phát hành bởi luồng đã thu được nó, trong khi bạn có thể báo hiệu semaphore từ bất kỳ luồng nào khác Những điểm chính: • Một chuỗi có thể có được nhiều hơn một khóa (Mutex). • Một mutex có thể bị khóa nhiều lần chỉ khi một mutex đệ quy, ở đây khóa và mở khóa cho mutex phải giống nhau • Nếu một chuỗi đã khóa mutex, cố gắng khóa mutex lại, nó sẽ vào danh sách chờ của mutex đó, dẫn đến bế tắc. • semaphore nhị phân và mutex giống nhau nhưng không giống nhau. • Mutex hoạt động tốn kém do các giao thức bảo vệ liên quan đến nó. • Mục đích chính của mutex là đạt được quyền truy cập nguyên tử hoặc khóa tài nguyên 9 hữu ích 0 bình luận chia sẻ answer Hoàng Nhật Phương · Hoàng Nhật Phương 17:53 06/03/2011 Một Mutex kiểm soát truy cập vào một nguồn tài nguyên chia sẻ duy nhất. Nó cung cấp các hoạt động để có được () quyền truy cập vào tài nguyên đó và giải phóng () nó khi hoàn thành. Một Semaphore kiểm soát quyền truy cập vào hồ bơi chung các nguồn tài nguyên. Nó cung cấp các hoạt động cho Wait () cho đến khi một trong các tài nguyên trong nhóm trở nên khả dụng và Signal () khi được đưa trở lại nhóm. Khi số lượng tài nguyên mà Semaphore bảo vệ lớn hơn 1, nó được gọi là Semaphore đếm . Khi nó kiểm soát một tài nguyên, nó được gọi là Semaphore Boolean . Một semaphore boolean tương đương với một mutex. Do đó, Semaphore là một mức độ trừu tượng cao hơn Mutex. Một Mutex có thể được thực hiện bằng cách sử dụng Semaphore nhưng không phải là cách khác. 8 hữu ích 0 bình luận chia sẻ answer Đỗ Hà Nhi · Đỗ Hà Nhi 09:36 03/05/2010 Câu hỏi được sửa đổi là - Sự khác biệt giữa một mutex và một semaphore "nhị phân" trong "Linux" là gì? Trả lời: Sau đây là những khác biệt - i) Phạm vi - Phạm vi của mutex nằm trong một không gian địa chỉ quy trình đã tạo ra nó và được sử dụng để đồng bộ hóa các luồng. Trong khi đó semaphore có thể được sử dụng trên không gian quá trình và do đó nó có thể được sử dụng để đồng bộ hóa quá trình. ii) Mutex nhẹ và nhanh hơn semaphore. Futex thậm chí còn nhanh hơn. iii) Mutex có thể được mua lại bởi cùng một luồng thành công nhiều lần với điều kiện nó sẽ giải phóng nó cùng một số lần. Chủ đề khác cố gắng để có được sẽ chặn. Trong khi đó trong trường hợp semaphore nếu cùng một quá trình cố gắng để có được nó một lần nữa thì nó sẽ bị chặn vì nó chỉ có thể được lấy một lần. 6 hữu ích 1 bình luận chia sẻ answer Trần Quốc Đạt · Trần Quốc Đạt 18:24 22/11/2008 Mutex hoạt động để chặn khu vực quan trọng, nhưng Semaphore hoạt động rất tốt. 5 hữu ích 0 bình luận chia sẻ answer Hoàng Khánh Hằng · Hoàng Khánh Hằng 06:22 26/11/2012 http://www.geekforgeek.org/archives/9102 thảo luận chi tiết. Mutexlà cơ chế khóa được sử dụng để đồng bộ hóa quyền truy cập vào tài nguyên. Semaphorelà cơ chế báo hiệu. Tùy thuộc vào lập trình viên nếu anh ấy / cô ấy muốn sử dụng semaphore nhị phân thay cho mutex. 5 hữu ích 0 bình luận chia sẻ answer Hoàng Bảo Hiển · Hoàng Bảo Hiển 11:31 30/03/2015 Khác biệt giữa Semaphore nhị phân và Mutex: OWNERSHIP: Semaphores có thể được báo hiệu (đăng) ngay cả từ một chủ sở hữu không hiện tại. Nó có nghĩa là bạn có thể chỉ cần đăng từ bất kỳ chủ đề khác, mặc dù bạn không phải là chủ sở hữu. Semaphore là một tài sản công cộng trong quá trình, Nó có thể được đăng đơn giản bởi một chủ đề không phải chủ sở hữu. Vui lòng đánh dấu sự khác biệt này trong các chữ cái BÓNG, nó có nghĩa là rất nhiều. 5 hữu ích 0 bình luận chia sẻ answer Huỳnh Huy Tuấn · Huỳnh Huy Tuấn 22:10 18/08/2010 Ngoài thực tế là các mutexes có chủ sở hữu, hai đối tượng có thể được tối ưu hóa cho việc sử dụng khác nhau. Mutexes được thiết kế để được tổ chức chỉ trong một thời gian ngắn; vi phạm điều này có thể gây ra hiệu suất kém và lập kế hoạch không công bằng. Ví dụ, một luồng đang chạy có thể được phép có được một mutex, mặc dù một luồng khác đã bị chặn trên nó. Semaphores có thể cung cấp công bằng hơn, hoặc công bằng có thể bị buộc sử dụng một số biến điều kiện. 4 hữu ích 3 bình luận chia sẻ answer Hồ Ðức Phi · Hồ Ðức Phi 09:38 23/02/2012 Trong cửa sổ sự khác biệt là như dưới đây. MUTEX: quá trình thực hiện thành công chờ đợi phải thực hiện tín hiệu và ngược lại. CÁC HÌNH ẢNH BÌNH THƯỜNG: Các quy trình khác nhau có thể thực hiện thao tác chờ hoặc tín hiệu trên một semaphore. 4 hữu ích 0 bình luận chia sẻ answer Đặng Quang Tùng · Đặng Quang Tùng 04:12 13/08/2013 Khái niệm này là rõ ràng với tôi sau khi đi qua bài viết trên. Nhưng có một số câu hỏi còn sót lại. Vì vậy, tôi đã viết đoạn mã nhỏ này. Khi chúng ta cố gắng đưa ra một semaphore mà không lấy nó, nó sẽ đi qua. Nhưng, khi bạn cố gắng đưa ra một mutex mà không lấy nó, nó đã thất bại. Tôi đã thử nghiệm điều này trên nền tảng Windows. Cho phép USE_MUTEX chạy cùng mã bằng MUTEX. #include <stdio.h> #include <windows.h> #define xUSE_MUTEX 1 #define MAX_SEM_COUNT 1 DWORD WINAPI Thread_no_1( LPVOID lpParam ); DWORD WINAPI Thread_no_2( LPVOID lpParam ); HANDLE Handle_Of_Thread_1 = 0; HANDLE Handle_Of_Thread_2 = 0; int Data_Of_Thread_1 = 1; int Data_Of_Thread_2 = 2; HANDLE ghMutex = NULL; HANDLE ghSemaphore = NULL; int main(void) { #ifdef USE_MUTEX ghMutex = CreateMutex( NULL, FALSE, NULL); if (ghMutex == NULL) { printf("CreateMutex error: %d\n", GetLastError()); return 1; } #else // Create a semaphore with initial and max counts of MAX_SEM_COUNT ghSemaphore = CreateSemaphore(NULL,MAX_SEM_COUNT,MAX_SEM_COUNT,NULL); if (ghSemaphore == NULL) { printf("CreateSemaphore error: %d\n", GetLastError()); return 1; } #endif // Create thread 1. Handle_Of_Thread_1 = CreateThread( NULL, 0,Thread_no_1, &Data_Of_Thread_1, 0, NULL); if ( Handle_Of_Thread_1 == NULL) { printf("Create first thread problem \n"); return 1; } /* sleep for 5 seconds **/ Sleep(5 * 1000); /*Create thread 2 */ Handle_Of_Thread_2 = CreateThread( NULL, 0,Thread_no_2, &Data_Of_Thread_2, 0, NULL); if ( Handle_Of_Thread_2 == NULL) { printf("Create second thread problem \n"); return 1; } // Sleep for 20 seconds Sleep(20 * 1000); printf("Out of the program \n"); return 0; } int my_critical_section_code(HANDLE thread_handle) { #ifdef USE_MUTEX if(thread_handle == Handle_Of_Thread_1) { /* get the lock */ WaitForSingleObject(ghMutex, INFINITE); printf("Thread 1 holding the mutex \n"); } #else /* get the semaphore */ if(thread_handle == Handle_Of_Thread_1) { WaitForSingleObject(ghSemaphore, INFINITE); printf("Thread 1 holding semaphore \n"); } #endif if(thread_handle == Handle_Of_Thread_1) { /* sleep for 10 seconds */ Sleep(10 * 1000); #ifdef USE_MUTEX printf("Thread 1 about to release mutex \n"); #else printf("Thread 1 about to release semaphore \n"); #endif } else { /* sleep for 3 secconds */ Sleep(3 * 1000); } #ifdef USE_MUTEX /* release the lock*/ if(!ReleaseMutex(ghMutex)) { printf("Release Mutex error in thread %d: error # %d\n", (thread_handle == Handle_Of_Thread_1 ? 1:2),GetLastError()); } #else if (!ReleaseSemaphore(ghSemaphore,1,NULL) ) { printf("ReleaseSemaphore error in thread %d: error # %d\n",(thread_handle == Handle_Of_Thread_1 ? 1:2), GetLastError()); } #endif return 0; } DWORD WINAPI Thread_no_1( LPVOID lpParam ) { my_critical_section_code(Handle_Of_Thread_1); return 0; } DWORD WINAPI Thread_no_2( LPVOID lpParam ) { my_critical_section_code(Handle_Of_Thread_2); return 0; }4 hữu ích 0 bình luận chia sẻ answer Hoàng Vạn Bách · Hoàng Vạn Bách 08:55 15/07/2016 Mặc dù một semaphore nhị phân có thể được sử dụng như một mutex, một mutex là một trường hợp sử dụng cụ thể hơn, trong đó chỉ có quá trình khóa mutex được cho là để mở khóa nó. Hạn chế quyền sở hữu này giúp bảo vệ chống lại:
Những ràng buộc này không phải lúc nào cũng có mặt vì chúng làm giảm tốc độ. Trong quá trình phát triển mã của bạn, bạn có thể kích hoạt các kiểm tra này tạm thời. ví dụ: bạn có thể bật thuộc tính Kiểm tra lỗi trong mutex của bạn. Lỗi khi kiểm tra mutexes trở lại EDEADLKnếu bạn cố gắng khóa cùng một lần hai lần và EPERMnếu bạn mở khóa một mutex không phải của bạn. pthread_mutex_t mutex; pthread_mutexattr_t attr; pthread_mutexattr_init (&attr); pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ERRORCHECK_NP); pthread_mutex_init (&mutex, &attr);Sau khi khởi tạo, chúng ta có thể đặt các kiểm tra này vào mã của mình như sau: if(pthread_mutex_unlock(&mutex)==EPERM) printf("Unlock failed:Mutex not owned by this thread\n");3 hữu ích 0 bình luận chia sẻ answer Vũ Quốc Ðại · Vũ Quốc Ðại 08:09 19/03/2013 Mutex được sử dụng để bảo vệ mã và dữ liệu nhạy cảm, semaphore được sử dụng để đồng bộ hóa. Bạn cũng có thể sử dụng thực tế với bảo vệ mã nhạy cảm, nhưng có thể có rủi ro giải phóng sự bảo vệ của luồng khác bằng thao tác V.So Chính sự khác biệt giữa bi-semaphore và mutex là quyền sở hữu nhà vệ sinh và khóa cửa, nhưng người khác có thể vào bằng cách yêu cầu quản trị viên mở cửa, thật nực cười. 2 hữu ích 0 bình luận chia sẻ answer Lý Anh Khôi · Lý Anh Khôi 13:55 15/09/2008 Câu trả lời có thể phụ thuộc vào hệ điều hành đích. Ví dụ: ít nhất một triển khai RTOS mà tôi quen thuộc sẽ cho phép nhiều hoạt động "nhận" tuần tự đối với một mutex OS duy nhất, miễn là tất cả chúng đều nằm trong cùng một bối cảnh luồng. Bội số phải được thay thế bằng số lần đặt bằng nhau trước khi một luồng khác sẽ được phép lấy mutex. Điều này khác với các ngữ nghĩa nhị phân, chỉ cho phép một lần lấy duy nhất tại một thời điểm, bất kể bối cảnh luồng. Ý tưởng đằng sau loại mutex này là bạn bảo vệ một đối tượng bằng cách chỉ cho phép một bối cảnh duy nhất sửa đổi dữ liệu tại một thời điểm. Ngay cả khi luồng nhận được mutex và sau đó gọi một hàm sửa đổi thêm đối tượng (và nhận / đặt mutex bảo vệ xung quanh các hoạt động của chính nó), các hoạt động vẫn sẽ an toàn vì tất cả đều diễn ra trong một luồng. { mutexGet(); // Other threads can no longer get the mutex. // Make changes to the protected object. // ... objectModify(); // Also gets/puts the mutex. Only allowed from this thread context. // Make more changes to the protected object. // ... mutexPut(); // Finally allows other threads to get the mutex. }Tất nhiên, khi sử dụng tính năng này, bạn phải chắc chắn rằng tất cả các truy cập trong một luồng thực sự an toàn! Tôi không chắc mức độ phổ biến của phương pháp này, hoặc liệu nó có áp dụng bên ngoài các hệ thống mà tôi quen thuộc không. Để biết ví dụ về loại mutex này, hãy xem ThreadX RTOS. 1 hữu ích 2 bình luận chia sẻ answer Trần Ðình Nhân · Trần Ðình Nhân 11:03 02/03/2012 Mutexes có quyền sở hữu, không giống như semaphores. Mặc dù bất kỳ luồng nào, trong phạm vi của một mutex, có thể có được một mutex đã được mở khóa và khóa truy cập vào cùng một phần quan trọng của mã, chỉ có luồng đã khóa một mutex mới mở khóa nó . 1 hữu ích 1 bình luận chia sẻ answer Hoàng Ðình Quảng · Hoàng Ðình Quảng 02:12 10/02/2016 Như nhiều người ở đây đã đề cập, một mutex được sử dụng để bảo vệ một đoạn mã quan trọng (phần quan trọng của AKA.) Bạn sẽ có được mutex (khóa), nhập phần quan trọng và giải phóng mutex (mở khóa) tất cả trong cùng một luồng . Trong khi sử dụng một semaphore, bạn có thể tạo một luồng chờ trên một semaphore (nói luồng A), cho đến khi một luồng khác (nói luồng B) hoàn thành bất kỳ nhiệm vụ nào, và sau đó đặt Semaphore cho luồng A dừng chờ và tiếp tục nhiệm vụ của nó. 1 hữu ích 0 bình luận chia sẻ answer Hoàng Nhã Sương · Hoàng Nhã Sương 17:30 15/10/2015 Mutex và semaphore nhị phân đều có cùng một cách sử dụng, nhưng trong thực tế, chúng khác nhau. Trong trường hợp của mutex, chỉ có luồng đã bị khóa mới có thể mở khóa. Nếu bất kỳ chủ đề khác đến để khóa nó, nó sẽ chờ. Trong trường hợp semaphone, đó không phải là trường hợp. Semaphore không được gắn với một ID chủ đề cụ thể. 1 hữu ích 0 bình luận chia sẻ |