LINUX.ORG.RU

Многопоточнось, пытаюсь 2 потока сделать, как правильно?

 , ,


0

2

Всем привет, решил начать изучать многопоточность. Есть допустим у меня такой вот класс:

class Sphere {
  vec2 position;
  vec2 size;
  float rotation;

  void onProgress() {
    ...
  }

  void onRender(Camera camera) {
    ...
  }
}

Я хочу сделать, чтобы рендеринг выполнялся в одном потоке, а onProgress в другом, т.е. onRender по сути, может только считывать данные position, size и rotation. В общем если я делаю как-то так:

class Application {
  void onProgress() {
    sphere.onProgress();
    ...
  }

  void onProgressRun() {
    while (running) {
      onProgress();
    }
  }

  void onRender() {
    sphere.onRender(camera);
    ...
  }

  void loop() {
    new Thread(&onProgressRun()).start();

    while (running) {
      ...
      onRender();
    }
  }
}

В общем это вроде бы работает, но мне кажется что так делать наверное не стоит, что произойдет, если я попытаюсь у sphere изменить position или любой другой аттрибут в основном потоке, к примеру в Application.onProgress, наверное нужно делать синхронизации? Или вообще то, каким образом я делаю не правильно? как правильнее подобную логику делать?

★★★

Последнее исправление: Int64 (всего исправлений: 2)

Ответ на: комментарий от deep-purple

Ну да я догадываюсь, что нужно использовать это. Просто интересно как правильно сделать на вот этом маленьком примере, можно ли читать переменные из класса без синхронизации? Получается лучше поля position, size и rotation сделать методами, к примеру так:

class Sphere {
  @property void position(in vec2 position) {
    synchronized {
      m_position = position;
    }
  }

  @property vec2 position() {
    return m_position;
  }

  ...

  void onProgress() {
    ...
  }

  void onRender(Camera camera) {
    ...
  }

private:
  vec2 m_position;
  vec2 m_size;
  float m_rotation;
}

Int64 ★★★
() автор топика

А вот вообще вопрос, нужна ли многопоточность для меня. Ну вот к примеру есть GUI, который отрисовывается, для гуя основные 2 метода есть - onProgress и onRender, я вот думал что имеет смысл разделить на потоки рендеринг и прогресс. И по идее там будет другой рендеринг еще, всяких объектов, которые в теории могут затормозить все, я вот думаю этот рендеринг наверное тоже имеет смысл выносить в поток. Но тогда получается нужно заморачиваться с синхронизациями. Но в принципе в методе onRender идет только чтение переменных, и никаких записей, а onProgress наоборот все это дело просчитывает, позиционирование, разные хендлеры итд. Но иногда может понадобиться в основном потоке менять позиционирование, и тогда нужно синхронизации. Либо просто сделать общий один поток для GUI и еще один для других задач.

Int64 ★★★
() автор топика

не знаток DLang'а, но для полей, доступных из разных потоков должны быть блокировки(мютексы, семафоры).

Ну и в отрисовке лучше использовать локальную копию данных, чтобы заморозить их на момент отрисовки.

nihirash ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.