using System;
using System.Threading;
namespace Namespace1
{
class C1
{
private bool deadlocked = true;
//这个方法用到了lock,我们希望lock的代码在同一时刻只能由一个线程访问
public void LockMe(object o)
{
while (deadlocked)
{
deadlocked = (bool)o;
Console.WriteLine("Foo: I am locked :(");
Thread.Sleep(500);
}
}
//所有线程都可以同时访问的方法
public void DoNotLockMe()
{
Console.WriteLine("I am not locked :)");
}
}
class Program
{
static void Main(string[] args)
{
C1 c1 = new C1();
//在t1线程中调用LockMe,并将deadlock设为true(将出现死锁)
Thread t1 = new Thread(c1.LockMe);
t1.Start(true);
}
}
}
请问高手:程序的执行结果是不断输出"Foo: I am locked :(",而在C++中不会不断输出这个结果的,因为操作系统没有给t1线程分配时间片,主函数就退出了。不过在C#中,怎么操作系统一直给t1线程分配时间?我不太明白。
16 个解决方案
#1
while (true)
{
}
#2
没看到将deadlocked 置为false的地方啊!!!
#3
请问高手:程序的执行结果是不断输出"Foo: I am locked :(",而在C++中不会不断输出这个结果的,因为操作系统没有给t1线程分配时间片,主函数就退出了。不过在C#中,怎么操作系统一直给t1线程分配时间?我不太明白。
#4
你调用的方法为死循环,会一直执行下去的
#5
我不是指什么lock的用法,这个是我随便网上找来的列子,这个代码如果用C++来写的话,效果完全不同,因为t1线程根本没有被执行。
#6
楼主用C++代码发出来对比下。。
#7
show C++ code
#8
C#输出结果正常~~~
求C++代码~~
求C++代码~~
#9
楼猪都面向时间片了.
不会.
不会.
#10
你写个死循环想问什么???
#11
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(
LPVOID lpParameter
);
void main()
{
HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
cout<<"Main threading running"<<endl;
//Sleep(10);
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter
)
{
cout<<"thread1 is running"<<endl;
return 0;
}
写不写Sleep(10)效果大不一样。
#12
写Sleep(10)线程会释放当前的cpu ,这样有可能别的线程会得到cpu
注意 是"可能"
#13
也就是说主线程sleep后 Fun1Proc有可能会运行
#14
至于你C#程序一直输出 是因为你启动的是前台线程,线程不退出,进程不会退出。
#15
前面正解这是个死循环
#16
回答的很好啊,谢谢了。
#1
while (true)
{
}
#2
没看到将deadlocked 置为false的地方啊!!!
#3
请问高手:程序的执行结果是不断输出"Foo: I am locked :(",而在C++中不会不断输出这个结果的,因为操作系统没有给t1线程分配时间片,主函数就退出了。不过在C#中,怎么操作系统一直给t1线程分配时间?我不太明白。
#4
你调用的方法为死循环,会一直执行下去的
#5
我不是指什么lock的用法,这个是我随便网上找来的列子,这个代码如果用C++来写的话,效果完全不同,因为t1线程根本没有被执行。
#6
楼主用C++代码发出来对比下。。
#7
show C++ code
#8
C#输出结果正常~~~
求C++代码~~
求C++代码~~
#9
楼猪都面向时间片了.
不会.
不会.
#10
你写个死循环想问什么???
#11
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(
LPVOID lpParameter
);
void main()
{
HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
cout<<"Main threading running"<<endl;
//Sleep(10);
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter
)
{
cout<<"thread1 is running"<<endl;
return 0;
}
写不写Sleep(10)效果大不一样。
#12
写Sleep(10)线程会释放当前的cpu ,这样有可能别的线程会得到cpu
注意 是"可能"
#13
也就是说主线程sleep后 Fun1Proc有可能会运行
#14
至于你C#程序一直输出 是因为你启动的是前台线程,线程不退出,进程不会退出。
#15
前面正解这是个死循环
#16
回答的很好啊,谢谢了。