LINUX.ORG.RU

[TCL] threads and shared var.

 


0

1

код

#! /usr/bin/tclsh
package require Thread

set bbb {11 22 33 44}

foreach tsv::set array ccc $bbb {
        set id [thread::create -joinable {
                puts [tsv::get array ccc]
        }]
        lappend ti $id
}

foreach id $ti {
        thread::join $id
}

Выхлоп

./threads.tcl
Error from thread tid0x7f3c860eb700
no key array(ccc)
    while executing
"tsv::get array ccc"
    invoked from within
"puts [tsv::get array ccc]"
Error from thread tid0x7f3c858ea700
no key array(ccc)
    while executing
"tsv::get array ccc"
    invoked from within
"puts [tsv::get array ccc]"
Error from thread tid0x7f3c84ed2700
no key array(ccc)
    while executing
"tsv::get array ccc"
    invoked from within
"puts [tsv::get array ccc]"
Error from thread tid0x7f3c846d1700
no key array(ccc)
    while executing
"tsv::get array ccc"
    invoked from within
"puts [tsv::get array ccc]"

Где накосячил?

★★

Последнее исправление: macumazan (всего исправлений: 1)

Выкрутился

foreach ccc $bbb {
        tsv::set array ccc $ccc

хотя что-то как-то не красиво...

macumazan ★★
() автор топика

foreach tsv::set array ccc $bbb {

синтаксис форича:
foreach varList list ?varList list ...? command

получается, что tsv::set — внутренняя переменная цикла, array — список из одного элемента

anonymous
()

Еще:

set id [thread::create -joinable {
puts [tsv::get array ccc]
}]

кусок «puts [tsv::get array ccc]» выполняется при создании треды. Какой в этом смысл?

anonymous
()
Ответ на: комментарий от anonymous

получается, что tsv::set — внутренняя переменная цикла

Не, это не переменная, это объявление шары для переменной ccc. В этом то вся и непонятка. Мне надо, что бы переменная цикла была доступна в каждом треде.

macumazan ★★
() автор топика
Ответ на: комментарий от anonymous

Какой в этом смысл?

Никакого конечно. Это тренировка.

macumazan ★★
() автор топика
Ответ на: комментарий от macumazan

Не, это не переменная, это объявление шары для переменной ccc. В этом то вся и непонятка.

foreach tsv::set {a b c d} ccc $bbb {
   puts $tsv::set
}

a b c d

Это именно переменная.

anonymous
()
Ответ на: комментарий от anonymous

Кстати, есть подозрение, что в таком виде нет 100% гарантии, что всякому i-му треду будет соответствовать строго i-ый элемент списка? Или я не прав?

macumazan ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.