- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
static char example(struct pt *pt)
{
switch(pt->lc) { case 0:
while(1)
{
pt->lc = 11; case 11: if(!(counter == 1000)) return 0;
printf("Threshold reached\n");
counter = 0;
}
} pt->lc = 0; return 2;
}
Я тоже где-то слышал, что оператор != не thread-safe
У меня printf для rs-232 вообще кастрированный был, строк 50 на сишке. Выводил только целые числа разного размера (только хексами, без паддингов и прочих свистоперделок) да строки. И этого хватало за глаза ;)
P.S. Сколько байт там было - х.з., не замерял. Но строки всяко весили больше, чем сам printf.
и без говнодаффа никак?
Пытаясь понять этот код у меня stack overflow.
while(counter != 1000);
?
while(counter==1000) {
printf("Threshold reached\n");
counter = 0;
}
Ок, спрошу по другому.
Чем код выше с нераскрытыми макросами отличается от
while(counter==1000) {
...
}
?
Твой код эту 1000 тиков счётчика будет тупо жрать проц, а код ОП'а займётся другими "тредами" или тупо поспит для экономии энергии.
Посмотри внимательно на код. Он возвращает управление в вызывающую функцию, если counter != 1000. А при counter == 1000 он сбрасывает counter на 0 и тоже возвращает управление.
По сути, получается конечный автомат.
P.S. Я так понимаю, что обычные локальные переменные тут юзать нельзя. Только глобалки и, возможно, какую-то приватную структуру, доступную через pt.
P.P.S. Да, чтобы всё это нормально работало, надо мутить полноценные wait-notify, а не говно со счётчиком. Кстати, вполне возможно, что они там есть.
Откуда-то оттуда, наверное ;)
Хорошо, что в Паскале так нельзя.
Не, это не то. В коде топика switch прыгает сразу внутрь цикла.
А select в го няшный - с ним можно отмену асинхронных операций тривиально реализовать. Или спекулятивный параллелизм. Я всё жду, пока аналоги в кресты завезут.