Если вы разделяете ресурс между потоками, и некоторые из этих потоков читают, а другие пишут, тогда он должен быть всегда защищен.
Трудно дать какой-либо совет, не зная больше о вашем коде, но здесьВот некоторые общие моменты, о которых следует помнить.
1) Критические разделы защищают ресурсы , а не процессы .
2) Введите / оставьте критические секции в одном и том же порядке во всех потоках.Если поток A входит в Foo, затем входит в Bar, тогда поток B должен вводить Foo и Bar в том же порядке.Если вы этого не сделаете, вы можете создать расу.
3) Вход и выход должны быть выполнены в обратном порядке.Например, поскольку вы вошли в Foo, а затем в Bar, вы должны покинуть Bar, прежде чем покинуть Foo.Если вы этого не сделаете, вы можете создать тупик.
4) Сохраняйте блокировки в течение минимально возможного периода времени.Если вы покончили с Foo до того, как начали использовать Bar, отпустите Foo перед тем, как взять Bar.Но вы все равно должны помнить правила заказа сверху.В каждом потоке, который использует Foo и Bar, вы должны приобретать и выпускать в одном и том же порядке:
Enter Foo
Use Foo
Leave Foo
Enter Bar
Use Bar
Leave Bar
5) Если вы читаете только 99,9% времени и пишете 0,1% времени, не делайтестараться быть умнымВы все еще должны ввести критическую секунду, даже когда вы только читаете.Это потому, что вы не хотите, чтобы запись начиналась, когда вы находитесь в середине чтения.
6) Сохраняйте критические разделы гранулярными.Каждый критический раздел должен защищать один ресурс, а не несколько ресурсов.Если вы сделаете критические секции слишком «большими», вы можете сериализовать ваше приложение или создать очень таинственный набор тупиков или рас.