Не раз и не два слышал от адептов свободного софта (когда их загоняли в угол неоспоримыми аргументами), что, мол, а чего вы хотите от опенсорса? Это, мол, вещь от программистов и для программистов. Что с того что Опен Офис тормозной, линукс глючный, а гимп корявый? Это всё фигня, вот средства для разработки под никсами, вот они точно the best. А остальное всё не стоит обсуждения.

    Проблема в том, что всё это, господа, брехня. У средств разработки (тут они понимаются в расширенном смысле, не только IDE, но и фреймворки, скрипты, утилиты и др.) при ближайшем рассмотрении обнаруживаются все те же родовые травмы, что и у опесорсного софта. Помню, какое-то время назад читал блог парня, плотно занимавшегося использованием wxWidgets’ов. Причем, судя по блогу, парниша далеко не дурак. И вот в одном посте он написал, что очередная программа написана и можно её портировать под MacOS X. Тут я чуть со стула не навернулся. Простите, wxWidgets это же кроссплатформенная библиотека. О каком портировании идёт речь? Почесал я репу, да и пошёл искать инфу на эту тему. Ответ пришёл, откуда я его не ждал.

    Тут надо сделать маленькое лирическое отступление и рассказать о том, как работать с потоками в никсах. Если кратко, то POSIX’овые потоки это задница. Разработчики этого API сделали маленькое предположение, что если извне срубить поток, то это может привести к критичным последствиям в работе программы. Например, в процессе передачи данных через сокет, что-нибудь не так передастся. Ну и решили это место обложить подушками, дабы программисты сами себе по ногам не стреляли. И будучи чрезвычайно последовательными и упорными в этом желании, навертели такой несусветной ахинеи, что многие быдлокодеры обзавидуются. Во-первых, они решили, что по описанным выше причинам, прерывать поток абы где не есть хорошо. Поэтому они это запретили. Во-вторых, он поняли, что этот запрет является серьёзным недостатком разрабатываемого АПИ. И, смилостившись, разрешили прерывать поток в некоторых местах. Ей богу я не вру. Т.е. они взяли список всех функций, прервав поток во время исполнения которых, мы ничего не сломаем в программе, и разрешили убивать поток в точках работы этих функций. Их получилось, прямо скажем, не богато. Круто? Но подождите. Предел идиотии ещё не достигнут. Потому что сразу возник логичный вопрос. А что будет, если в потоке ни одна из этих функций не вызывается? Ну, например, эти функции по логике программы там не нужны и поэтому не используются. Программа будет вечно ждать завершения потока? Как быть? Пытливый и извращённый мозг, подсказал решение. В-третьих, они сделали функцию, которая ничего не делает, но в процессе выполнения которой, поток может быть прерван. Когда разработчиков спросили, знают ли они функцию kill, которая без лишних затей работает с процессами именно так как ожидается. И что вместо потоков можно создавать процессы и управлять ими как заблагорассудится. Поэтому была придумана функция pthread_setcanceltype, которая позволяет включить возможность рубить потоки в любой момент их выполнения. Однако, красноглазики про эту функцию рассказывать не любят и при любом упоминании неистово крестятся.

    Ну и катарсис. Забота о программистах, чтобы что-нибудь не сломалось, бла бла бла - всё это чушь собачья, созданная с одной целью – замаскировать недостатки реализации операционной системы. В виндах-то функция срубания потока есть. И работает так, как и должна работать. Без всяких оговорок и ложной заботы о программисте. Вообще поражает желание некоторых людей, запретить мне стрелять себе в ногу. Если мне это нужно для дела, то почему бы нет?

    Ну, так вот. Стало быть, есть и в виндах и никсах функциональности прерывания потока. Но работают они очень сильно по-разному. Как написать над этим хозяйством враппер? Если быть до конца честным, то никак. Почему-то создатели wxWidgets’ов дали другой ответ на этот вопрос и, не моргнув глазом, создали функцию wxThread::Kill, и в описании указали «This function is dangerous and should be used with extreme care (and not used at all whenever possible)!» Над Qt работают более честные парни, написавшие что, QThread::terminate прерывает поток следующим образом: “The thread may or may not be terminated immediately, depending on the operating systems scheduling policies.” Т.е. может прерваться, а может и нет.

    Вот такая получается кроссплатформенность без кроссплатформенности.

    ЗЫ Кстати в Питоне с потоками полный порядок. Создатели запретили прерывать потоки извне, обеспечив настоящую кроссплатформенность своему детищу.

    Еще статьи о программировании и создании ПО