Tôi có một số mã C đơn giản sử dụng một biến toàn cầu đơn. Rõ ràng đây không phải là thread-an toàn, vì vậy khi tôi gọi nó từ nhiều chủ đề trong C# bằng cách sử dụng P/gọi, mọi thứ vít lên.Cách tạo mã C (P/gọi) được gọi từ C# "An toàn chủ đề"
Làm cách nào để nhập chức năng này một cách riêng biệt cho từng chuỗi hoặc làm cho chuỗi này an toàn?
Tôi đã cố gắng khai báo biến số __declspec(thread)
, nhưng điều đó khiến chương trình gặp sự cố. Tôi cũng đã thử tạo một lớp C++/CLI, nhưng nó không cho phép các hàm thành viên là __declspec(naked)
, mà tôi cần (Tôi đang sử dụng lắp ráp nội tuyến). Tôi không có kinh nghiệm viết mã C++ đa luồng, vì vậy có thể có một cái gì đó tôi đang thiếu.
Dưới đây là một số mã ví dụ:
C#
[DllImport("MyDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int SomeFunction(int parameter1, int parameter2);
C++
extern "C"
{
int someGlobalVariable;
int __declspec(naked) _someFunction(int parameter1, int parameter2)
{
__asm
{
//someGlobalVariable read/written here
}
}
int __declspec(dllexport) SomeFunction(int parameter1, int parameter2)
{
return _someFunction(parameter1, parameter2);
}
}
[Chỉnh sửa]: Kết quả của SomeFunction()
phải theo một số thứ tự được quy định dựa trên someGlobalVariable
(ví dụ: PRNG, với someGlobalVariable
làm trạng thái nội bộ). Do đó, việc sử dụng mutex hoặc loại khóa khác không phải là tùy chọn - mỗi chủ đề phải có bản sao riêng là someGlobalVariable
.
Bạn có thường xuyên gọi điều này - bạn có thể thực hiện khóa ở mặt C#, giả sử bạn không sở hữu C mã? –
@SteveTownsend: Không, chủ yếu là tất cả các chủ đề đa làm là gọi hàm đó. –
Liệu nó có phải là một biến toàn cục? Bạn có thể trả về trạng thái từ hàm và yêu cầu một trạng thái được truyền lại cho hàm khi nó được gọi là lần sau. (Hoặc một con trỏ đến trạng thái.) – dtb