Как превратить мой проект в многопоточное приложение - PullRequest
1 голос
/ 25 февраля 2011

У меня есть проект, и я хочу преобразовать его в многопоточное приложение. Что можно сделать, чтобы сделать это многопоточное приложение

Перечислите, что нужно сделать для преобразования в многопоточное приложение
например, блокировка мьютекса на общих переменных.
Я не смог найти вопрос, в котором перечислены все те, кто под одним капюшоном. проект находится в C

Ответы [ 4 ]

2 голосов
/ 25 февраля 2011

Однопоточное приложение не должно заботиться о том, чтобы быть потокобезопасным.

Эта проблема возникает, когда у вас есть несколько потоков, которые пытаются получить доступ к общему ресурсу. В это время вы должны быть обеспокоены.

Так что, не нужно беспокоиться.


РЕДАКТИРОВАТЬ (после редактирования вопроса):

Вам необходимо перейти по следующим ссылкам.

Также хороший совет для преобразования однопоточного приложения в одно. Проверьте.

1 голос
/ 25 февраля 2011

Это очень сильно зависит от того, как именно вы намереваетесь использовать потоки. Что делает ваша программа? Где вы хотите использовать темы? Что будут делать эти темы?

Вам необходимо выяснить, какими ресурсами эти потоки будут делиться, и применить соответствующую блокировку. Поскольку вы начинаете с однопоточного приложения, рекомендуется минимизировать общие ресурсы, чтобы упростить перенос. Например, если у вас есть один поток GUI прямо сейчас, и вам нужно выполнить несколько сложных вычислений в нескольких потоках, порождайте эти потоки, но не заставляйте их напрямую касаться каких-либо данных для GUI - вместо этого отправьте асинхронное сообщение в Поток GUI (как вы это делаете, зависит от ОС и библиотеки GUI) и может ли он обрабатывать любые изменения данных потока GUI сериализованным способом в самом потоке GUI.

Как общий совет, не добавляйте темы вольно-невольно. Вы должны точно знать , какие переменные и структуры данных совместно используются потоками, где к ним осуществляется доступ и почему. И вы должны сводить указанное деление к минимуму.

1 голос
/ 25 февраля 2011

Большая проблема заключается в том, что в целом при разработке приложения очень сложно выбрать один поток, а затем добавить многопоточность. Выбор имеет основополагающее значение для дизайна идиомы, к которым вы будете стремиться. Вот краткое, но плохое руководство по некоторым вещам, на которые вы должны обращать внимание, и по тому, как изменить свой код (обратите внимание, что ни один из них не сделан в камне, всегда есть обходной путь):

  1. Удалить все изменяемые глобальные переменные. Я бы сказал, что это относится и к однопоточным приложениям, но это только я.
  2. Добавьте "const" к как можно большему количеству переменных в качестве первого прохода, чтобы решить, где происходят изменения состояния, и делать записи об ошибках компиляции. Это не значит «превратить все ваши переменные в const». Просто разобраться, где будут ваши проблемные области, просто взломать.
  3. Для тех элементов, которые являются изменяемыми и которые будут использоваться совместно (то есть вы не можете оставлять их как const без предупреждений компиляции), установите вокруг них блокировки. Каждый замок должен быть зарегистрирован.
  4. Далее представьте свои темы. Вероятно, вы будете страдать от множества взаимоблокировок, блокировок, условий гонки и других проблем, поскольку ваше однопоточное приложение делало предположения о порядке и порядке выполнения вашего приложения.
  5. Начните с удаления ненужных блокировок. То есть посмотрите на изменяемое состояние, которое не используется в ваших потоках. Эти замки излишни и должны быть отправлены.
  6. Далее изучите ваш код. На данный момент, определение того, где находятся ваши проблемы, - это больше искусство, чем наука. Хотя есть достойные руководители о том, как это сделать, это все, что я могу сказать.

Если это звучит как слишком большое усилие, пришло время взглянуть на модель актера для параллелизма. Это было бы похоже на создание нескольких разных приложений, которые вызывают друг друга по схеме передачи сообщений. Я считаю, что актеры не только интуитивно понятны, но и чрезвычайно дружелюбны, чтобы определить, где и как вы можете столкнуться с проблемами многопоточности. При настройке Актеров почти невозможно не думать обо всех «что, если».

Лично, когда я имею дело с однопоточным многопоточным преобразованием, я делаю как можно меньше для достижения целей проекта. Это просто безопаснее.

0 голосов
/ 25 февраля 2011

Без более подробного описания вашего приложения почти невозможно дать вам полный ответ.

Будет хорошей идеей дать некоторое представление о вашем понимании потоков.

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

Эта страница Википедии должна стать хорошим началом: http://en.wikipedia.org/wiki/Thread_safety

...