Я всегда предполагал, что renderscripts являются потокобезопасными с forEach через распределение. Чтобы помочь в моей отладке, может кто-то подтвердить это?Об ошибках и потокобезопасности
(я вижу статический контроль значение массива успешно, но с помощью rsDebug показывает, что проверка должна не увенчались успехом.
static uint32_t state[16];
static void f(); // modifies state.
/* snip... */
void
root(const uint32_t *in, uint32_t *out)
{
/* snip... */
f();
if(state[0] == 0)
{
rsDebug("state[0]", state[0]);
*out = 1;
}
}
Я вижу, напечатанный состояние [0] с ненулевым значением!)
Мой код должен действовать полностью точечно. Весь скрипт слишком длинный, но я подведу его выше. Это вызвано вызовом forEach_root с Java. (Я знаю, что было некоторое упоминание о том, что скрипты не вызываются синхронно, но применимо ли это к статическим fns?) – zeta
Вы действительно полагаетесь на неопределенное поведение здесь. Если ваша функция f() изменяет состояние, вы не можете иметь независимые потоки root(), ожидающие увидеть (или не увидеть) эти изменения. Подумайте об этом так: драйвер RS может запускать все потоки для root() последовательно или одновременно. Если ваш алгоритм/ядро ведет себя по-другому на основе этого, вам нужно сделать что-то другое. –
ОК. Я полагаю, что по расширению вы говорите, что Renderscript не гарантирует, что 'state' не будет изменен другими потоками, и поэтому ядро, как я описал выше, не является потокобезопасным. Правильно ли я понял? – zeta