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