我正在嘗試自學自己的過程在c#中線程化,我一直在閱讀大量的教程,問題和示例。我已經成功地(*它似乎工作)實現了線程到更大的應用程序,但它們是一些對我來說很灰暗的地方。線程和線程安全 - 如何管理數據進出線程
我試圖把一個小的控制檯應用程序放在一起作爲討論的焦點,並嘗試回答提出的問題。我不是一個有經驗的程序員 - 所以如果我在這裏犯了一些致命的罪行,我真誠道歉。隨意指出,以提高我的編程技能。希望我在這裏提出的問題能夠幫助我和其他人嘗試理解線程化。
第一個問題是 - 如果我叫 randomNums.GenrateRandomNumbers()內的ThreadStart(),將在該 被認爲是不安全的。我得出結論,它會是 PrintRandomCNumbers()正在從其他線程調用,它會意味着對象將處於非常未確定的狀態?
如果我想打電話給randomNums.GenrateRandomNumbers,那麼線程安全的方式是什麼?如何以及在哪裏實施 鎖定,我會使用寫入多重讀鎖嗎?
當運行該應用程序,每個線程正確輸出randomNums的 內容,是有一個方案(多個處理器或核 ),其中給定的這種實現中的信息將不會 存在以輸出,但拷貝的對象引用仍然在 範圍內。即randomNums變爲null。
如果沒有硬件方案,我將如何處理這個 示例來生成這樣的場景。即Threadmanger擁有 Randomnums對象引用,但它只是最終指向 未啓動對象,但嘗試啓動該對象。 (在我的更大的應用程序中,我有一個 類似的問題。)
什麼是使數據進出 線程的最佳設計實踐?
當設計一個線程來啓動時,最好的做法是管理對象內部或對象外的線程的開始和頂部。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
// Using System Threading for theads;
using System.Threading;
namespace ThreadingExamples
{
class Program
{
static void Main(string[] args)
{
MyApplication app = new MyApplication();
app.Start();
}
public class MyApplication
{
private RandomNumbers randomNums;
public MyApplication()
{
}
public void Start()
{
randomNums = new RandomNumbers();
randomNums.GenrateRandomNumbers();
randomNums.PrintRandomcNumbers();
ThreadManager newThreadMan = new ThreadManager(randomNums);
Console.ReadLine();
}
}
public class ThreadManager
{
private RandomNumbers randomNums;
private Thread[] newThreads;
private int threadCount;
public ThreadManager(RandomNumbers newRandomNums)
{
threadCount = 3;
randomNums = newRandomNums;
newThreads = new Thread[threadCount];
for (int i = 0; i < threadCount; i++)
{
newThreads[i] = new Thread(ThreadStart);
newThreads[i].Start();
}
}
public void ThreadStart()
{
randomNums.PrintRandomcNumbers();
}
}
public class RandomNumbers
{
private Random rnd = new Random();
private int numberToStore;
private int[] randomNumbers;
public RandomNumbers()
{
numberToStore = 12;
randomNumbers = new int[numberToStore];
}
public void GenrateRandomNumbers()
{
for (int i = 0; i < numberToStore; i++)
{
randomNumbers[i] = rnd.Next(1,13);
}
}
public void PrintRandomcNumbers()
{
StringBuilder outputString = new StringBuilder();
for (int i = 0; i < numberToStore; i++)
{
outputString = new StringBuilder("The Random Numbers in position ");
outputString.Append(i.ToString());
outputString.Append("is the number: ");
outputString.Append(randomNumbers[i].ToString());
Console.WriteLine(outputString);
}
}
}
}
}
只問一個問題。你無法從SO問題中學習線程,有很多優秀的書籍可用。 –
好的學習線程在SO旁邊,我試着把一些問題集中到一點,而不是一個開放式問題。 –
請閱讀[問]。 –