2009-09-02 28 views

Trả lời

20

Tương đương với khóa/SyncLock sẽ sử dụng lớp Monitor.

Trong .NET 1-3.5sp, khóa (obj) thực hiện:

Monitor.Enter(obj); 
try 
{ 
    // Do work 
} 
finally 
{ 
    Monitor.Exit(obj); 
} 

Tính NET 4, nó sẽ là:

bool taken = false; 
try 
{ 
    Monitor.Enter(obj, ref taken); 
    // Do work 
} 
finally 
{ 
    if (taken) 
    { 
     Monitor.Exit(obj); 
    } 
} 

Bạn có thể dịch này để C++ bằng cách thực hiện :

System::Object^ obj = gcnew System::Object(); 
Monitor::Enter(obj); 
try 
{ 
    // Do work 
} 
finally 
{ 
    Monitor::Exit(obj); 
} 
+7

Tôi muốn xem xét http://stackoverflow.com/questions/1369459/cs-lock-in-managed -c/7527111 # 7527111 vượt trội ở chỗ nó là cả hai trong bản chất C++ (RAII) cũng như gần gũi hơn với từ khóa khóa C# – sehe

-2

Thử Threading.Monitor. Và bắt được.

+0

Và bắt? Âm thanh sai lầm. – sehe

2

Không tương đương với từ khóa lock trong C++. Bạn có thể làm điều này thay vì:

Monitor::Enter(instanceToLock); 
try 
{ 
    // Only one thread could execute this code at a time 
} 
finally 
{ 
    Monitor::Exit(instanceToLock); 
} 
55

C++/CLI không có một lớp 'khóa' - tất cả các bạn cần làm là khai báo biến khóa sử dụng ngữ nghĩa dựa trên stack và nó sẽ an toàn thoát khỏi màn hình khi destructor của nó được gọi , ví dụ:

#include <msclr\lock.h> 
{  
    msclr::lock l(m_lock); 

    // Do work 

} //destructor of lock is called (exits monitor). 

Khai báo 'm_lock' tùy thuộc vào thành viên bạn muốn bảo vệ. Để bảo vệ các thành viên dụ sử dụng này:

Object^ m_lock = gcnew Object(); // Each class instance has a private lock - 
           // protect instance members. 

để bảo vệ các thành viên tĩnh sử dụng này:

static Object^ m_lock = gcnew Object(); // Type has a private lock - 
             // protect static members. 
+0

Đã xóa 'nội dung nguy hiểm' bằng 'làm việc' để không làm xáo trộn mọi người. Cảm ơn ý kiến ​​của bạn. – Sereger

+0

+1 - xấu hổ tôi không thể +2 thực sự – sehe

+0

Tôi không quen với C++, làm thế nào để bạn khai báo 'x'? Cảm ơn – Baptiste

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