2009-09-11 4 views
1

Я пишу сетевую библиотеку, которую пользователь может передать указателю на функцию для определенных сетевых событий. Чтобы поддерживать цикл прослушивания от приложения разработчика, я передаю обработчик события в поток. К сожалению, это создает немного головную боль для обработки вещей поточно-безопасным способом. Например, если разработчик передает функцию, которая вызывает вызовы для своих элементов приложения Windows :: Forms, тогда будет выведено исключение InvalidOperationException.потокобезопасные указатели функций в C++

Есть ли хорошие стратегии для обеспечения безопасности потоков?

+0

Не должен ли разработчик быть ответственным, чтобы удостовериться, что они не меняют свой компонент до тех пор, пока они не попадут в поток событий? –

+0

Что вы подразумеваете под «thread safety» в вопросе - вы специально хотите, чтобы функция обратного вызова изменяла элементы Forms из другого потока? «Как написать многопоточный код?» ИМО не достаточно конкретна, чтобы отвечать. –

ответ

2

Указатели функций не могут быть потокобезопасными, поскольку они объявляют точку вызова. Так что они просто указатели. Ваш код всегда запускается в потоке, из которого он был вызван (через указатель функции).

Что вы хотите достичь, так это то, что ваш код работает в определенном потоке (возможно, в потоке пользовательского интерфейса). Для этого вы должны использовать какую-то очередь для синхронизации вызова в MainThread.

Это именно то, что .Net BeginInvoke()/Invoke() на форме. Очередь в этом случае (где-то глубоко внутри платформы .NET) - очередь сообщений Windows.

Но вы можете использовать любую другую очередь, пока «правильный» поток читает и выполняет запросы на вызов из этой очереди.

+0

Я не уверен, не согласны мы или нет. «Ваш код всегда работает в потоке, который использовался для его вызова». Я не знаю, что это значит. если вы хотели сказать: «Ваш код всегда работает в потоке, который указатель функции использовал для его вызова». то это правильно. В противном случае это звучит так, будто вы хотите сказать, что функция, с которой ссылается указатель, не будет иметь уникальный контекст при вызове, и это неверно. –

+0

Я отредактировал ответ, так что теперь, надеюсь, будет ясно. – mmmmmmmm