+
+{
+ my @threads;
+ my $flag : shared = 0;
+ my $destroyed;
+
+ {
+ my $wiz = wizard(
+ set => sub {
+ my $tid = threads->tid;
+ pass "set callback called in thread $tid"
+ },
+ free => sub { ++$destroyed },
+ );
+
+ my $var = 123;
+ cast $var, $wiz;
+
+ @threads = map spawn(
+ sub {
+ my $tid = threads->tid;
+ my $exp = 456 + $tid;
+ {
+ lock $flag;
+ threads::shared::cond_wait($flag) until $flag;
+ }
+ $var = $exp;
+ is $var, $exp, "\$var could be assigned to in thread $tid";
+ }
+ ), 1 .. 5;
+ }
+
+ is $destroyed, 1, 'wizard is destroyed';
+
+ {
+ lock $flag;
+ $flag = 1;
+ threads::shared::cond_broadcast($flag);
+ }
+
+ $_->join for @threads;
+}