using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
class Program {
static void Main(string[] args) {
int i = 5;
Console.WriteLine("before: {0}", i);
var thread = new myThread<int>(
(state) => {
state.value += 1;
}
);
thread.Start(
(obj) => { i = obj; },
() => i
);
while (thread.IsAlive)
;
Console.WriteLine("after: {0}", i);
}
class myThread<T>
{
public delegate void ThreadStart(StateObject state);
private Thread _thread;
public myThread(ThreadStart start)
{
_thread = new Thread((obj) => { start.Invoke((StateObject)obj); });
}
public void Start(StateObject obj)
{
_thread.Start(obj);
}
public void Start(Action<T> f_set, Func<T> f_get) {
_thread.Start(new StateObject(f_set, f_get));
}
public bool IsAlive { get { return _thread.IsAlive; } }
public class StateObject {
private Action<T> _f_set;
private Func<T> _f_get;
public StateObject(Action<T> f_set, Func<T> f_get)
{
_f_set = f_set;
_f_get = f_get;
}
public T value {
set { _f_set(value); }
get { return _f_get(); }
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UZXh0Owp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwoKY2xhc3MgUHJvZ3JhbSB7CiAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBpbnQgaSA9IDU7CgogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJiZWZvcmU6IHswfSIsIGkpOwoKICAgICAgICB2YXIgdGhyZWFkID0gbmV3IG15VGhyZWFkPGludD4oCiAgICAgICAgICAgIChzdGF0ZSkgPT4gewogICAgICAgICAgICAgICAgc3RhdGUudmFsdWUgKz0gMTsKICAgICAgICAgICAgfQogICAgICAgICk7CgogICAgICAgIHRocmVhZC5TdGFydCgKICAgICAgICAgICAgKG9iaikgPT4geyBpID0gb2JqOyB9LAogICAgICAgICAgICAoKSA9PiBpCiAgICAgICAgKTsKCiAgICAgICAgd2hpbGUgKHRocmVhZC5Jc0FsaXZlKQogICAgICAgICAgICA7CgogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhZnRlcjogezB9IiwgaSk7CiAgICB9CgogICAgY2xhc3MgbXlUaHJlYWQ8VD4KICAgIHsKICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBUaHJlYWRTdGFydChTdGF0ZU9iamVjdCBzdGF0ZSk7CgogICAgICAgIHByaXZhdGUgVGhyZWFkIF90aHJlYWQ7CgogICAgICAgIHB1YmxpYyBteVRocmVhZChUaHJlYWRTdGFydCBzdGFydCkKICAgICAgICB7CiAgICAgICAgICAgIF90aHJlYWQgPSBuZXcgVGhyZWFkKChvYmopID0+IHsgc3RhcnQuSW52b2tlKChTdGF0ZU9iamVjdClvYmopOyB9KTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIFN0YXJ0KFN0YXRlT2JqZWN0IG9iaikKICAgICAgICB7CiAgICAgICAgICAgIF90aHJlYWQuU3RhcnQob2JqKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIFN0YXJ0KEFjdGlvbjxUPiBmX3NldCwgRnVuYzxUPiBmX2dldCkgewogICAgICAgICAgICBfdGhyZWFkLlN0YXJ0KG5ldyBTdGF0ZU9iamVjdChmX3NldCwgZl9nZXQpKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBib29sIElzQWxpdmUgeyBnZXQgeyByZXR1cm4gX3RocmVhZC5Jc0FsaXZlOyB9IH0KCiAgICAgICAgcHVibGljIGNsYXNzIFN0YXRlT2JqZWN0IHsKICAgICAgICAgICAgcHJpdmF0ZSBBY3Rpb248VD4gX2Zfc2V0OwogICAgICAgICAgICBwcml2YXRlIEZ1bmM8VD4gX2ZfZ2V0OwogICAgICAgICAgICBwdWJsaWMgU3RhdGVPYmplY3QoQWN0aW9uPFQ+IGZfc2V0LCBGdW5jPFQ+IGZfZ2V0KSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX2Zfc2V0ID0gZl9zZXQ7CiAgICAgICAgICAgICAgICBfZl9nZXQgPSBmX2dldDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIFQgdmFsdWUgewogICAgICAgICAgICAgICAgc2V0IHsgX2Zfc2V0KHZhbHVlKTsgfQogICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9mX2dldCgpOyB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCg==