1. 程式人生 > >C# 獲取多執行緒ID

C# 獲取多執行緒ID

【文章標題】: 亂塗C#多執行緒02

【文章作者】: 有酒醉

【作者郵箱】: [email protected]

【下載地址】: 自己搜尋下載

【作者宣告】: 只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!

【詳細過程】

採用執行緒池執行緒執行任務我們無法直接控制執行緒.有時我們想直接控制執行緒的行為,那麼我們可以建立非執行緒池執行緒.

// ThreadDemo.cs  
// Author by Yzl  

using System;  
using System.Threading;  

public class ThreadDemo  
{  
    public
static void Main(string[] args) { Thread t = new Thread(new ThreadStart(ThreadProc)); t.Start(); Console.WriteLine("Priority:" + t.Priority); Console.WriteLine("ThreadState:" + t.ThreadState); for (int i = 0; i < 5; i ++) { Console.WriteLine("Hello Main"
); Thread.Sleep(100); } } private static void ThreadProc() { for (int i = 0;i < 5; i ++) { Console.WriteLine("Hello ThreadProc"); Thread.Sleep(500); } } }

編譯執行:

D:>csc ThreadDemo.cs

Microsoft (R) Visual C# .NET 編譯器版本 7.10.6001.4

用於 Microsoft (R) .NET Framework 版本 1.1.4322

版權所有 (C) Microsoft Corporation 2001-2002。保留所有權利。

D:>ThreadDemo

Hello ThreadProc

Priority:Normal

ThreadState:WaitSleepJoin

Hello Main

Hello Main

Hello Main

Hello Main

Hello Main

Hello ThreadProc

Hello ThreadProc

Hello ThreadProc

Hello ThreadProc

前臺執行緒和後臺執行緒:執行緒池執行緒都是後臺執行緒,一般執行緒建立時預設為前臺執行緒,可以通過Thread.IsBackground屬性進行更改.一旦程式中不再有前臺執行緒,Windows將終止該程式.

我們先來看看前臺執行緒

// ThreadDemo.cs  
// Author by Yzl  

using System;  
using System.Threading;  

public class ThreadDemo  
{  
    public static void Main(string[] args)  
    {  
        Thread t = new Thread(new ThreadStart(ThreadProc));  
        t.Name = "CustomThread";  
        //t.IsBackground = true;  
        t.Start();      
    }  

    private static void ThreadProc()  
    {  
        for (int i = 0;i < 5; i ++)  
        {  
            Console.WriteLine("Hello ThreadProc");  
            Thread.Sleep(800);  
        }  
    }  
}

D:>csc ThreadDemo.cs

D:>ThreadDemo

Hello ThreadProc

Hello ThreadProc

Hello ThreadProc

Hello ThreadProc

Hello ThreadProc

奇怪!程式並未呼叫Thread.Join()方法,自定義執行緒也一樣執行完.正常情況下t.Start()執行完後Main也就終結了,整個程式應該退出才是!

接下來我們測試一下後臺執行緒,將下面程式碼的註釋去掉:

//t.IsBackground = true;

重新執行看效果:

D:>csc ThreadDemo.cs

D:>ThreadDemo

D:>

什麼結果也沒有!!換句話說,只要有一個前臺執行緒,不管Main上程式碼是否都已經執行,它也將等待其他前臺執行緒執行完畢才退出.如果Main上的程式碼都已執行同時不存在前臺執行緒,那麼程式自動退出.

同樣還有一個問題存在,我們更改一下上面的程式:

// ThreadDemo.cs  
// Author by Yzl  

using System;  
using System.Threading;  

public class ThreadDemo  
{  
    public static void Main(string[] args)  
    {  
        Thread t = new Thread(new ThreadStart(ThreadProc));  
        t.Name = "CustomThread";  
        Thread.CurrentThread.IsBackground = true; // 注意!設定主執行緒為後臺執行緒!  
        Console.WriteLine("the t of thread is Background:" + t.IsBackground); // 注意!  
        t.Start();      
    }  

    private static void ThreadProc()  
    {  
        for (int i = 0;i < 5; i ++)  
        {  
            Console.WriteLine("Hello ThreadProc");  
            Thread.Sleep(800);  
        }  
    }  
}

編譯執行:

D:>csc ThreadDemo.cs

Microsoft (R) Visual C# .NET 編譯器版本 7.10.6001.4

用於 Microsoft (R) .NET Framework 版本 1.1.4322

版權所有 (C) Microsoft Corporation 2001-2002。保留所有權利。

D:>ThreadDemo

the t of thread is Background:False

D:>

問題1:如果按我們剛才的理解,t是前臺執行緒,Main理應等待執行緒t完全執行完畢才是,但是結果卻什麼也沒輸出!這是什麼緣故?暫時還沒研究出答案,待我們深入探討之後在回頭看這個問題

非託管執行緒是通過執行緒ID來標識的,託管執行緒則通過雜湊程式碼(Thread.GetHashCode())或名稱(Thread.Name)來標識.獲取當前執行緒ID採用AppDomain.GetCurrentThreadId().

示例-獲取執行緒ID

// T.cpp  
// Author by Yzl  

#include < stdio.h >   
#using < mscorlib.dll >  
using namespace System::Threading;  

#pragma managed  
__gc class ThreadDelagate  
{  
    public:  
        void Start()  
        {  
            ThreadStart *ts = new ThreadStart(this,ThreadProc);  
            Thread* myThread = new Thread(ts);      
            myThread->Start();  
        }  
    private:  
        void ThreadProc()  
        {  
            printf("Thread id:%d",System::AppDomain::GetCurrentThreadId());      
        }          
};  

#pragma managed  
int main()  
{  
    ThreadDelagate *td = new ThreadDelagate;  
    td->Start();      
}

編譯執行:

D:>cl /clr T.cpp

Microsoft (R) C/C++ Optimizing Compiler Version 13.10.3077 for .NET Framework

Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

T.cpp

Microsoft (R) Incremental Linker Version 7.10.3077

Copyright (C) Microsoft Corporation. All rights reserved.

/out:T.exe

T.obj

D:>T

Thread id:1800

D:>

注意!如果將main更改為:

#pragma unmanaged

int main()

{

ThreadDelagate *td = new ThreadDelagate;

td->Start();    

}

編譯將得到如下錯誤:

error C3821: “ThreadDelagate” : 託管型別不能用於非託管函式

error C3169: “td” : 在非託管函式內不能宣告託管物件或 __gc 指標

error C3821: “ThreadDelagate” : 託管型別不能用於非託管函式

error C3175: “ThreadDelagate::ThreadDelagate” : 不能從非託管函式“main”呼叫託管型別的方法

error C3821: “td” : 託管型別不能用於非託管函式

error C3175: “ThreadDelagate::Start” : 不能從非託管函式“main”呼叫託管型別的方法

原因我就不多講.很明朗!因此,如果要操縱託管執行緒ID,需先把它儲存起來,然後在非託管程式碼中進行應用.

示例-列舉非託管執行緒(ProcessThread表示作業系統程序執行緒)

// ProcessThreadDemo.cs  
// Author by Yzl  

using System;  
using System.Diagnostics;  

public class ProcessThreadDemo  
{  
    public static void Main(string[] args)  
    {  
        Console.ReadLine();  
        ProcessThreadCollection ptCollection = Process.GetCurrentProcess().Threads;  
        Console.WriteLine("{0} threads in process",ptCollection.Count);     
        foreach (ProcessThread pt in ptCollection)  
        {  
            Console.WriteLine("ID:{0},State:{1},Priority:{2}",pt.Id,pt.ThreadState,pt.PriorityLevel);  
        }  
    }  
}

編譯執行:

D:>ProcessThreadDemo

h

7 threads in process

ID:3700,State:Running,Priority:Normal

ID:1076,State:Wait,Priority:Normal

ID:452,State:Wait,Priority:Highest

ID:2292,State:Wait,Priority:Normal

ID:3872,State:Wait,Priority:Normal

ID:2952,State:Wait,Priority:Normal

ID:996,State:Wait,Priority:Normal

通過列舉的方式我們發現該程式存在7個執行緒,但是在執行初期,我們通過工作管理員發現它的執行緒數才3個!這是什麼原因呢?原來在列舉程序執行緒的操作實際上會使CLR建立更多的執行緒,用以執行此列舉操作!!

<續>

相關推薦

C# 獲取執行ID

【文章標題】: 亂塗C#多執行緒02 【文章作者】: 有酒醉 【作者郵箱】: [email protected] 【下載地址】: 自己搜尋下載 【作者宣告】: 只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教! 【詳細過程】 採用執行

C++11執行程式設計 第八章: 使用 std::future std::promise 更優雅的獲取執行返回值

C++11 Multithreading – Part 8: std::future , std::promise and Returning values from Thread Varun June 20, 2015 C++11 Multithreading – Part

c++builder 執行-建立 退出 及獲取執行返回碼

1. WIN32 API執行緒的建立 在程式中呼叫CreateThread函式可以建立一個執行緒: HANDLE CreateThread(    LPSECURITY_ATTRIBUTES lpThreadAttributes,    D

linux下C開發執行程式

轉:https://blog.csdn.net/lingfemg721/article/details/6574804   linux下用C開發多執行緒程式,Linux系統下的多執行緒遵循POSIX執行緒介面,稱為pthread。   #

[轉]c++11 執行 future/promise

[轉自 https://blog.csdn.net/jiange_zh/article/details/51602938] 1. < future >標頭檔案簡介 Classes std::future std::future_error std::packaged_task std::pro

C#非同步執行總結(delegate、Thread、Task、ThreadPool、Parallel、async、cancel)

同步與非同步多執行緒的區別: 1、同步方法卡介面(UI執行緒忙於計算);非同步多執行緒不卡介面(主執行緒閒置,子執行緒在計算) 2、同步方法慢(CPU利用率低、資源耗費少);非同步多執行緒快(CPU利用率高、資源耗費多) 3、同步方法是有序的;非同步方法是無序的(啟動無序、執行時間不確定、結

c++11執行 thread

 1.thread建構函式 default (1) thread() noexcept; initialization (2) template <class Fn, class... Args> explicit

C++11 執行執行共享資料

共享資料的問題 這些在作業系統中都有詳細的介紹,可以回顧作業系統課程。。很典型的就是資料競爭問題。 互斥量保護資料 最原始的方式:使用std::mutex建立互斥量,使用成員lock()加鎖,使用成員unlock()解鎖。但是這種方式需要我們在每個函數出口都呼叫一次unloc

python 獲取 執行的返回值

import time import threading class MyThread(threading.Thread): def __init__(self, target=None, args=(), **kwargs): super(MyThread

C#關於執行執行同步 lock鎖的應用

Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;

C++:執行與鎖

多執行緒是小型軟體開發必然的趨勢。C++11將多執行緒相關操作全部整合到標準庫中了,省去了某些坑庫的編譯,真是大大的方便了軟體開發。多執行緒這個庫簡單方便實用,下面給出簡單的例子     #include <iostream> #inc

java 利用Future非同步獲取執行任務結果

Future介面是Java標準API的一部分,在java.util.concurrent包中。Future介面是Java執行緒Future模式的實現,可以來進行非同步計算。 有了Future就可以進行三段式的程式設計了,1.啟動多執行緒任務2.處理其他事3.收集多執行緒任務結果。從而實現了非阻塞

C語言執行

將按鍵 和LED燈的控制放在兩個執行緒,因為通過按鍵檢測是阻塞 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <

C語言執行目錄操作

#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <sys/types.h>#include <dirent.h> #define NUM 2 void threa

c++11執行執行

最近需要開發一個高效能運算庫,涉及到c++多執行緒的應用,上次做類似的事情已經是4年多以前了,印象中還頗有些麻煩。悔當初做了就算了,也沒想著留點記錄什麼的。這次又研究了一番,發現用上c++11特性之後,現在已經比較簡單了,在此記錄一下。   最簡單的多執行緒情況,不涉及公共變數,各個執行緒之間獨

C++11執行(1)

        C++11中添加了duox多執行緒類,編寫C++程式可以直接使用C++11中的多執行緒庫,不必依賴於平臺多執行緒,這樣可以方便寫出誇平臺的多執行緒程式。多執行緒可以最大化利用計算機資源,提高程式碼的執行效率。         C++11中thread類提供兩

C++ 11 執行下std::unique_lock與std::lock_guard的區別和用法

這裡主要介紹std::unique_lock與std::lock_guard的區別用法 先說簡單的 一、std::lock_guard的用法 std::lock_guard其實就是簡單的RAII封裝,在建構函式中進行加鎖,解構函式中進行解鎖,這樣可以保證函式退出時,鎖一定被釋放。 簡單來說,就是防止開

C++11執行------std::async

std::async可以認為是封裝了一個std::promise,該函式返回一個std::future,用於獲取其他執行緒的資料。 一般有兩種模式: std::lanch::async:最常用的非同步模式,每次都要執行一遍 std::lanch::defer:只在第

C++11執行---互斥量、鎖、條件變數的總結

關於互斥量std::mutex的總結 互斥量用於組成程式碼的臨界區。C++的多執行緒模型是基於記憶體的,或者說是基於程式碼片段的,這和我們作業系統學習的臨界區概念基本一致,但是與Golang不同,Golang是基於訊息模型的。 一個std::mutex的lock()和unlock

C++11執行的原子操作

原子操作是同時只能有一個執行緒執行一個操作,不用使用互斥量即可實現,但是速度慢,而且一般只支援原生的型別,不夠靈活。更多的用處是作為訊號量進行使用。 示例程式碼,以int為例子: #include <atomic> #include <thread> #i