关于多线程的时间片问题。

时间:2022-06-01 17:48:23

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


引用楼主 gyf529036756 的回复:
C# code

using System;
using System.Threading;
namespace Namespace1
{
    class C1
    {
        private bool deadlocked = true;

        //这个方法用到了lock,我们希望lock的代码在同一时刻只能由一个线程访问
        public void L……
你调用的方法为死循环,会一直执行下去的

#5


我不是指什么lock的用法,这个是我随便网上找来的列子,这个代码如果用C++来写的话,效果完全不同,因为t1线程根本没有被执行。

#6


楼主用C++代码发出来对比下。。

#7


show C++ code

#8


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


引用 11 楼 gyf529036756 的回复:
C# code


#include <windows.h>
#include <iostream.h>

DWORD WINAPI Fun1Proc(
  LPVOID lpParameter  
);
void main()
{
    HANDLE hThread1;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,N……

写Sleep(10)线程会释放当前的cpu ,这样有可能别的线程会得到cpu

注意 是"可能"

#13


也就是说主线程sleep后 Fun1Proc有可能会运行

#14


至于你C#程序一直输出 是因为你启动的是前台线程,线程不退出,进程不会退出。

#15


前面正解这是个死循环

#16


引用 14 楼 ghost5216 的回复:
至于你C#程序一直输出 是因为你启动的是前台线程,线程不退出,进程不会退出。

回答的很好啊,谢谢了。

#1



while (true)
{
}

#2


没看到将deadlocked 置为false的地方啊!!!

#3


请问高手:程序的执行结果是不断输出"Foo: I am locked :(",而在C++中不会不断输出这个结果的,因为操作系统没有给t1线程分配时间片,主函数就退出了。不过在C#中,怎么操作系统一直给t1线程分配时间?我不太明白。

#4


引用楼主 gyf529036756 的回复:
C# code

using System;
using System.Threading;
namespace Namespace1
{
    class C1
    {
        private bool deadlocked = true;

        //这个方法用到了lock,我们希望lock的代码在同一时刻只能由一个线程访问
        public void L……
你调用的方法为死循环,会一直执行下去的

#5


我不是指什么lock的用法,这个是我随便网上找来的列子,这个代码如果用C++来写的话,效果完全不同,因为t1线程根本没有被执行。

#6


楼主用C++代码发出来对比下。。

#7


show C++ code

#8


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


引用 11 楼 gyf529036756 的回复:
C# code


#include <windows.h>
#include <iostream.h>

DWORD WINAPI Fun1Proc(
  LPVOID lpParameter  
);
void main()
{
    HANDLE hThread1;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,N……

写Sleep(10)线程会释放当前的cpu ,这样有可能别的线程会得到cpu

注意 是"可能"

#13


也就是说主线程sleep后 Fun1Proc有可能会运行

#14


至于你C#程序一直输出 是因为你启动的是前台线程,线程不退出,进程不会退出。

#15


前面正解这是个死循环

#16


引用 14 楼 ghost5216 的回复:
至于你C#程序一直输出 是因为你启动的是前台线程,线程不退出,进程不会退出。

回答的很好啊,谢谢了。