Page 1 of 1

Многопоточность

Posted: Mon Jun 26, 2017 2:17 pm
by Mr. Kibernetik
SPL может выполнять несколько потоков одновременно, также можно иметь доступ к одному и тому же объекту одновременно из нескольких потоков.
В этой программе запускается четыре потока: два - это копии функции PLUS, и они увеличивают объект A на 1 десять миллионов раз, два - это копии функции MINUS, и они уменьшают объект A на 1 десять миллионов раз.
Основной поток ждет, пока не завершатся запущенные потоки, и затем печатает результат: A остается равным 0.

Code: Select all

a = 0
fins = 0
n = 2

> i, 1..n
  fplus[i] = plus
  -> fplus[i]()
  fminus[i] = minus
  -> fminus[i]()
<

> fins!=n*2
<
#.output("result = ",a)

plus()=
  #.output("-> +")
  > i, 1..10000000
    .a!
    .a += 1
    .a~
  <
  #.output("<- +")
  .fins!
  .fins += 1
  .fins~
.
minus()=
  #.output("-> -")
  > i, 1..10000000
    .a!
    .a -= 1
    .a~
  <
  #.output("<- -")
  .fins!
  .fins += 1
  .fins~
.
Вывод программы:

Code: Select all

-> +
-> -
-> +
-> -
<- +
<- -
<- -
<- +
result = 0