主函数test(int i) 其中i取值1~100
单线程执行占用30%的CPU我想只同时运行两个线程,保证CPU占用大部分
比如起始开启
test(1)
test(2)
当上面两个线程任意一个执行完毕后再开启test(3)能做到吗?
起始就是如何判断线程结束,结束后开启下一个线程。最好能给出伪代码。。
单线程执行占用30%的CPU我想只同时运行两个线程,保证CPU占用大部分
比如起始开启
test(1)
test(2)
当上面两个线程任意一个执行完毕后再开启test(3)能做到吗?
起始就是如何判断线程结束,结束后开启下一个线程。最好能给出伪代码。。
void stocks(object o)
{
for (int i = 0; i < 10; i++)
{
Console.Write(o.ToString().PadLeft(3, '0')+" - "+i.ToString() + "\r\n");
Thread.Sleep(1000);
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread[] threads = new Thread[300];
for (int i = 0; i < 100; i++)
{
_sem.WaitOne();
threads[i] = new Thread(stocks);
threads[i].Name = "线程" + i.ToString() ;
threads[i].Start(i);
_sem.Release();
}
}错那了?
使用计数信号量Semaphore,是一个比较妥当的同步编程方法,推荐这样实现多个线程的同步。
你标题有可能误导出什么Semaphore来。按照你的描述,你要求控制先后执行次序,这只需要使用一个变量去标记是否调用过test3就好了,例如可以写:private object Test3Flag = (bool)false;void CheckCallTest3()
{
lock (Test3Flag)
{
if ((bool)Test3Flag == false)
{
Test3Flag = true;
test3();
}
}
}这个程序中关键的地方看来你的问题中根本没有涉及。其实会不会口口声声要“多线程”这不算什么,使用lock也不算什么困难的“线程同步”写法,我更加赞同#1楼的问题角度,许多时候简单出发点才是真,那些堆砌技术的反而经常把系统搞到万劫不复的地步。按照你的逻辑就可以肯简单地考虑到,上面这个程序其实也看出来了,你何必要“开启”什么test3?它原本就是使用其中一个已经开启的线程来继续执行的,也就是在test1或者test2执行完毕之后继续执行的。
就这种情况,用个int之类的做标志用互锁操作比较好,性能更高而且代码简单:
int test3Flag = 0;
void test3(){
if (Interlocked.Exchange(ref test3Flag,1) > 0)
return;
//TODO: DO Test3...
}void test1(){
//DO test1
test3();
}
void test2(){
//DO test2
test3();
}
1.临界区.
2.自旋锁.
3.内核对象/但我想M$不至于这么蛋疼.这三种随便一种和单纯互锁操作的效率查查就知道.最后,你用了object.每次还要装箱/拆箱.这也是要开销的.最后的最后.
其实那点性能开销基本可以54,
我就是看两行就搞定的东西多写了那么多行蛋疼....
{
new Thread(new ThreadStart(() =>
{
for (int i = Interlocked.Increment(ref value); i <= 100; i = Interlocked.Increment(ref value))
{
test(i);
}
})).Start();
}