- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
//main.cpp:
#define THREAD_COUNT 2
#include "winparallel.h"
main1()
{
lock(1);
int i=0; while(i++<10)
printf("1: %d\n", i);
unlock(1);
}
main2()
{
lock(1);
int i=0; while(i++<10)
printf("2: %d\n", i);
unlock(1);
}
main3(){};
main4(){};
main5(){};
main6(){};
main7(){};
main8(){};
//=====================================================================================
//winparallels.h:
#include <windows.h>
#define _MAX_CORES 8
LPVOID _void;
#define main1() DWORD WINAPI _main1(LPVOID lpParam)
#define main2() DWORD WINAPI _main2(LPVOID lpParam)
#define main3() DWORD WINAPI _main3(LPVOID lpParam)
#define main4() DWORD WINAPI _main4(LPVOID lpParam)
#define main5() DWORD WINAPI _main5(LPVOID lpParam)
#define main6() DWORD WINAPI _main6(LPVOID lpParam)
#define main7() DWORD WINAPI _main7(LPVOID lpParam)
#define main8() DWORD WINAPI _main8(LPVOID lpParam)
DWORD WINAPI _main1(LPVOID);
DWORD WINAPI _main2(LPVOID);
DWORD WINAPI _main3(LPVOID);
DWORD WINAPI _main4(LPVOID);
DWORD WINAPI _main5(LPVOID);
DWORD WINAPI _main6(LPVOID);
DWORD WINAPI _main7(LPVOID);
DWORD WINAPI _main8(LPVOID);
HANDLE _locks[_MAX_CORES];
int _argc; char **_argv;
void lock(int n) { DWORD res = WaitForSingleObject(_locks[n], INFINITE); }
void unlock(int n) { ReleaseMutex(_locks[n]); }
int main(int argc,char **argv) {
HANDLE threads[_MAX_CORES];
DWORD id;
int THREADS = THREAD_COUNT;
if (THREADS<=0) {
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
THREADS = sysinfo.dwNumberOfProcessors;
if (THREADS>_MAX_CORES) THREADS = _MAX_CORES;
}
_argc = argc; _argv = argv;
_locks[0] = CreateMutex(NULL,FALSE,NULL);
_locks[1] = CreateMutex(NULL,FALSE,NULL);
_locks[2] = CreateMutex(NULL,FALSE,NULL);
_locks[3] = CreateMutex(NULL,FALSE,NULL);
_locks[4] = CreateMutex(NULL,FALSE,NULL);
_locks[5] = CreateMutex(NULL,FALSE,NULL);
_locks[6] = CreateMutex(NULL,FALSE,NULL);
_locks[7] = CreateMutex(NULL,FALSE,NULL);
threads[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main1,NULL,0,&id);
if (THREADS>=2)
threads[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main2,NULL,0,&id);
if (THREADS>=3)
threads[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main3,NULL,0,&id);
if (THREADS>=4)
threads[3]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main4,NULL,0,&id);
if (THREADS>=5)
threads[4]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main5,NULL,0,&id);
if (THREADS>=6)
threads[5]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main6,NULL,0,&id);
if (THREADS>=7)
threads[6]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main7,NULL,0,&id);
if (THREADS>=8)
threads[7]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_main8,NULL,0,&id);
WaitForMultipleObjects(THREADS, threads, TRUE, INFINITE);
return 0;
}
А еще здесь не обошлось без бога копипасты... Потоки юзаем, а циклов не знаем...
P.S. Конструктор лего прям: вот тебе 8 локов и 1-8 потоков, собирай из них говно пирамидку, играйся... Треды для детей 3-5 лет.
Жаль, синтетоты слишком много и всё больше и больше. Нормального, не школоло, не PHP, не даты, не, не, не, а вполне промышленного загадочного или смешного кода осталось даже не через раз.
против кода - использование платформозависимых сущностей, plain C style в разделе C++. Не говоря уже про кривой код
подробнее
В семерке\висте пуск намноого более убогий. Я вот могу его юзать только как строку поиска... А скроллить его и искать в нем значки, непонятно как раскиданные по папкам - нет уж, увольте.
Метрошные плеер и ие отлично подходят для отдыха - полный экран, крупное и удобное управление, а что еще нужно? А для работы метро уй майкрософт и не предлагает.
меня устраивает связка Classic Shell + Launchy, решающая все проблемы компактности меню пуск и запуска часто используемых программ с клавиатуры в пару нажатий
в пуске причем раскиданы по алфавиту, разве в дефолтном пуске не так?
а вот жить совсем без пуска я не готов
зы. впрочем, дефолтный пуск в висте/семерке тоже дерьмище, ухудшение пуска у микрософта начались еще с xp, но в той хоть можно было системную галочку выставить "верните мне классический вид, суки"
так что неудивительно, что смена одного говна (пуск в семерке) на другое говно (метро уй) пользователями воспринята
Дык приходится вспоминать какая фирма придумала нужную мне прогу. В той же линухе категории адекватны - игры, разработка, система и т.п. А тут - foobar software, necrosoft corporation и прочие малознакомые личности...
> Launchy
Да, удобная штука.
> ухудшение пуска у микрософта начались еще с xp
Да, в хр всегда гонял его на классическом виде.
Ну а по метрошному пуску - там хоть можно часто используемые проги разместить на одном экране, и их количество не ограничено десятком как в семерочном пуске...
>>дефолтный пуск в висте/семерке тоже дерьмище
Не согласен. Мне привычно нажать Win, набрать первые три-четыре буквы названия программы и нажать Enter, а наиболее часто запускаемые программы закрепляются в лаунчере и вызываются по Win+цифра. И мне адски не хватает этих штук, когда я сажусь за машину с установленной хрюшей.
>часто запускаемые программы закрепляются в лаунчере и вызываются по Win+цифра
Ну вот я и говорю - попробуй консольные приложения, они заточены под клавиатуру.
Примерно теми же словами мне сокурсники предлагали попробовать травку :)
Пока я писал комментарий про убогость виндового cmd.exe по сравнению с gnome-terminal, вдруг вспомнил про PowerShell. Неужели в Windows появилось подобие нормального терминала?
Добавил симлинков в Сигвниновский /usr/bin на всякие папки внутри Program Files (пришлось немножко с UAC побороться, но получилось в итоге).
Единственное - что не победил: IIS, эти уроды его положили в Windows/System32 и еще части в Windows/WoW64. И там уже фиг знает, как их рассекретить, искал по регистри, но ничего путнего не нашел. И еще эта урдоская программа все свои файлы настроек создает от имени администратора.
Вобщем, жить можно, но не хочется. - Открыть файл программой зарегистрированой для расширения этого файла.
На восьмёрке я до сих пор не знаю вменяемого способа попасть в панель управления не за пять нажатий.
Есть и в пуске свои плюсы, не только относящиеся к списку приложений.
Надо и самому попробовать Meteroism UI. Уже представляю маркетолога, составляющего превью:
Чую такими темпами как они делают утомленные пользователи мс начнут массово пересаживаться на консоль.
P.S. Ещё в восьмёрке совершеннейше препоганая виртуальная клавиатура, но это уже совсем другая история.
http://pastebin.com/mqgFYfBR
Вот только lock1.unlock() должно вызываться и при исключениях.
Может как-то использовать RAII и деструктор для этой цели.
В Boost.Interprocess есть примитивы для всяческих извращений.
буст.тред и комплектный с ним mutex/scoped_lock, либо его копипаст в c++11
вообще интерпроцесс неоднозначная либа, в целях покрыть вообще все возможные платформы они решили, что единственный выход - эмулировать все межпроцессные вещи через шаред мемори
в реальной жизни же не всегда бывают настолько изолированные части одной системы, что отказ одной части вообще никак не повлияет на работу другой и всей системы в целом
Не может ли получиться так, что unlock() вызовется дважды? Ведь, емнип, конструкция A a = b; сначала создает временный объект с помощью конструктора A(b), а затем вызывает конструктор копирования, после чего разрушает временную копию.
но move semantics спасут крестного отца
Помню тут еще TheCalligrapher пояснял этот хак с областями видимости и багом VC. Кстати а куда он исчез? Жаль на гк нету способа показать все посты, можно было издать книгу "Издательство Говнокод"
Такой же трюк можно и с файлом сделать
Или в бусте уже есть готовое?
Это был сиамский близнец, после разделения ставший @defecate-plusplus & @bormand
P.s. На тему поиска комментов:
http://bit.ly/WwDRup
Хе-хе-хе. А Тарас (τορἄς) неделим по определению.
>bit.ly/WwDRup
Та я тоже так умею. Не очень удобно - сортировки нет.
Не совсем так. Обама же не родился президентом, и через несколько лет передаст полномочия другому. Поэтому Обама содержит в себе адаптер, реализующий интерфейс "Президент", ссылка на который помещена в свойство "президент" объекта "США".
Как? И он тоже?
Вследствие чего вызовется
ибо каждый президент США, в конце-концов, человек. Зато при
будет бяка, поскольку такая неявность недопустима.
Я к чему: если Человек и Чужой различны для бытия президентом США, как минимум, структурой организма, то чем для сего будут отличаться Человек и typedef Человек ЧеловекДвойноеСловоИлиВтороеИмяПрямоходя щегоПредставителяГуманоидов?
Разница будет лишь для потомков, которым выпадет читать подобную писанину истории и догадываться, что Пабло, Непомукено и Ремедиос - это в се тот же Пикассо.