Что является основным примером «низкоуровневой» многопоточности в C ++? - PullRequest
5 голосов
/ 13 октября 2008

Я своего рода новичок-разработчик с несколькими годами за плечами. Недавно я провел собеседование в игровой компании и спросил меня: «Вы делали какие-нибудь многопоточности?» Я рассказал им о наличии приложения на C # с несколькими потоками ... а затем немного рассказал о транзакциях, блокировке и т. Д. В Sql. Интервьюер вежливо сказал мне, что это слишком высокий уровень, и они ищут кого-то с опытом работы с многопоточностью в C ++.

Так что же является базовым примером "низкоуровневой" многопоточности в C ++?

Ответы [ 8 ]

12 голосов
/ 13 октября 2008

Каноническая реализация "потоков низкого уровня" - pthreads . Основными примерами проблем с многопоточностью, которые обычно преподаются вместе с pthreads, являются некоторые проблемы для читателей и писателей . Эта страница также ссылается на более классические проблемы с потоками, такие как производители / потребители и столовые философы.

3 голосов
/ 14 октября 2008

Если это игровая компания, то они, вероятно, хотят получить ответ примерно такой:

"Я реализовал многопоточную подпрограмму ИИ, которая распределяла вычисления дерева решений для NPC среди доступных ресурсов ЦП. Правильная блокировка, особенно при интеграции кода с остальной частью приложения, была сложной. Мы также потратили некоторое время на отслеживание использование ресурсов потока, чтобы мы могли ограничить обработку AI, когда она угрожала помешать отзывчивости основного интерфейса. "

(Я все это выдумал, лично я ничего такого не делал. ухмылка )

3 голосов
/ 13 октября 2008

Он, вероятно, имел в виду ваше использование C #, а не ваш опыт работы с потоками.

3 голосов
/ 13 октября 2008

Вот краткий пример использования pthreads, основанный на нашем тестовом коде. Он порождает две нити и ожидает их завершения.

int main( void )
{
  pthread_t reader, writer;
  void *arg;

  // [... initialisation ...]

  // Spawn threads
  if( pthread_create( &reader, NULL, reader_func, arg ) ||
      pthread_create( &writer, NULL, writer_func, arg ) )
    {
      perror( "pthread_create" );
      return EX_OSERR;
    }

  // Wait while threads run
  pthread_join( reader, &arg );
  pthread_join( reader, &arg );

  return EX_OK;
}

void *reader_func( void *arg )
{
  // [... do some stuff ...]
  return NULL;
}

void *writer_func( void *arg )
{
  // [... do some different stuff ...]
  return NULL;
}
2 голосов
/ 13 октября 2008

Я не думаю, что есть большая разница между тем, что вы делали, и использованием pthreads, если честно. Если вы проделали значительную работу с потоками, у вас возникли все проблемы с блокировкой, синхронизацией и т. Д., И вы могли бы достаточно легко напрямую использовать вызовы pthreads. Единственная хитрость, от которой вы, вероятно, были изолированы, это завершение, получение кодов выхода из потоков и т. Д.

(Конечно, pthreads не так низко, как вы можете получить; если вы работаете в linux, посмотрите clone (), чтобы увидеть, как он действительно работает на уровне системных вызовов. Но никто на самом деле не использует это если они не реализуют pthreads.)

2 голосов
/ 13 октября 2008

Я бы посмотрел на http://zthread.sourceforge.net/, который является отличной оболочкой для библиотеки PThreads. Это очень быстрая и стабильная библиотека, которая может быть довольно низкой. Очень хорошо написано и задокументировано.

1 голос
/ 14 октября 2008

Также Boost Threads - это довольно переносимая оболочка для pthreads и потоков Windows ... и насколько я знаю, многие магазины разработчиков игр используют C ++ и некоторые другие библиотеки Boost.

1 голос
/ 13 октября 2008

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

Загляните в uconext.h и его различные процедуры (setcontext, swapcontext и makecontext) и попробуйте написать с ними простую совместную библиотеку потоков. реализовать блокировки, создание / уничтожение потоков переменных условий и совместную выдачу. Это не будет особенно причудливо (то есть фактически нет параллелизма (для этого вам нужно просто покопаться в системном вызове клона или ядре), но если вы сможете это сделать, никто не сможет сказать, что у вас нет уровень опыта.

Просто чтобы дать представление о масштабе проекта. Я написал такую ​​простую библиотеку потоков примерно в 500 строках c ++, и, учитывая, что по крайней мере 20% из этого были комментарии, утверждения утверждений и ведение журнала для целей отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...