What we should note here is that other threads are attached to the thread where the Main() function is located. The Main() function is the entrance to the C# program. The starting thread can be called the main thread. If all foreground threads are stopped , then the main thread can be terminated, and all background threads will be terminated unconditionally. Although all threads are executed serially from a micro perspective, you can think of them as executing in parallel from a macro perspective.
Readers must have noticed the property Thread.ThreadState. This property represents the running state of the thread and has different values under different circumstances. Therefore, we can sometimes design the program flow by judging the value. The possible values of ThreadState in various situations are as follows:
Aborted: The thread has stopped
AbortRequested: The thread's Thread.Abort() method has been called, but the thread has not stopped yet
Background: The thread is executed in the background, and the attribute Thread .IsBackground related
Running: The thread is running normally
Stopped: The thread has been stopped
StoPRequested: The thread is being asked to stop
Suspended: The thread has been suspended (in this state, it can be re-run by calling the Resume() method)
SuspendRequested : The thread is requesting to be suspended, but there is no time to respond.
Unstarted: Thread.Start() is not called to start the running of the thread.
WaitSleepJoin: The thread is in a blocked state because it calls methods such as Wait(), Sleep() or Join().
As mentioned above, the Background status indicates that the thread is running in the background, so what is special about the thread running in the background? In fact, there is only one difference between background threads and foreground threads, that is, background threads do not prevent the termination of the program. Once all foreground threads of a process have terminated, the CLR (Common Language Runtime Environment) will completely terminate the process by calling the Abort() method of any surviving background process.
When threads compete for CPU time, the CPU provides services according to the priority of the thread. In C# applications, users can set 5 different priorities, from high to low, namely Highest, AboveNormal, Normal, BelowNormal, and Lowest. If the priority is not specified when creating a thread, the system defaults to ThreadPriority.Normal. . To assign a priority to a thread
, we can use the following code:
//Set the priority to the lowest
myThread.Priority=ThreadPriority.Lowest;
By setting the priority of the thread, we You can arrange for some relatively important threads to be executed first, such as responding to users and so on.
Now that we have a preliminary understanding of how to create and control a thread, we will delve into the more typical problems in thread implementation and explore their solutions.
3. Thread synchronization and communication - producers and consumers
Assume a situation where two threads maintain a queue at the same time. If one thread adds elements to the queue, and the other thread removes elements from the queue To retrieve elements, we call the thread that adds elements a producer, and the thread that retrieves elements a consumer. The producer-consumer problem seems simple, but it is a problem that must be solved in multi-threaded applications. It involves synchronization and communication issues between threads.
As mentioned earlier, each thread has its own resources, but the code area is shared, that is, each thread can execute the same function. However, in a multi-threaded environment, a possible problem is that several threads execute a function at the same time, causing data confusion and unpredictable results. Therefore, we must avoid this situation. C# provides a keyword lock, which can define a section of code as a mutually exclusive section (critical section). The mutually exclusive section allows only one thread to enter execution at a time, while other threads must wait. In C#, the keyword lock is defined as follows:
lock(expression) statement_block
The above is the content of the preliminary exploration of C#’s multi-threading mechanism (3). For more related content, please pay attention to the PHP Chinese website (www.php.cn )!