Programming with pthread? What is pthread?
Pthread, as the standard thread library for C/C ++ programming, is actually POSIX standard thread library.
So how to understand the POSIX standard?
Below are links to some materials. If you are interested, you can view them by yourself.
1. http://zh.wikipedia.org/wiki/POSIX
2. standards.ieee.org/findstds/standard/1003.1-2008.html
3. www.opengroup.org/austin/papers/posix_faq.html
4. www.unix.org/version3/ieee_std.html
Where can I find the pthread source code implementation?
If you want to literate or learn pthread, you can download the glibc source code, which includes the implementation of pthread.
Gnu ftp site link: http://ftp.gnu.org/gnu/glibc
Pthread APIs:
Pthread APIs can be divided into the following four parts:
1. thread management: operations on threads, such as creation, suspension, connection, and other operations on thread attributes.
2. mutexes: mutex lock, which supports synchronization.
3. Condition vars: Condition lock, communication between threads sharing mutex locks.
5. sync: Manage Synchronization
There are still a lot of Chinese learning materials about pthread, so here I will not be able to introduce more of those learning knowledge. If you are a newbie,
So please read the relevant materials and books before learning. Please forgive me ~
Pthread_exit and pthread_join.
I remember one day before the test, my graduate student asked me a question: he said that when he was using the pthread library, the worker thread he created didn't work. Let me help
Now I forget what he wrote.CodeBut I still remember the problem, so I can use another small example instead:
# Include <stdio. h> # include <stdlib. h> # include <unistd. h> # include <pthread. h> # define thread_nums 20 // workervoid * greeting (void * MSG); int main (INT ARGs, char ** argv) {pthread_t workers [thread_nums]; int retval; int index; char * MSG = "Hello pthread! "; For (Index = 0; index <thread_nums; index ++) {retval = pthread_create (& Workers [Index], null, greeting, (void *) MSG ); if (retval =-1) {printf ("% s \ n", "error! "); Exit (-1) ;}// pthread_exit (null); Return exit_success;} void * greeting (void * MSG) {printf (" thread # % lD, greeting % s \ n ", (long) pthread_self (), (char *) MSG); usleep (1000000 );}
I noticed pthread_exit (null) in the above Code. In fact, it is very easy to predict this smallProgramWhat is the situation? Only a part of the created thread is complete.
Another thread has lost the running environment before the job is finished, because the main thread has exited.
Well, the following is the function of pthread_exit (null), which is to wait for all sub-threads to exit.
Pthread_join is similar to pthread_exit, but the exit status code can be obtained from the exited subthread.
Note:
When the share memory method is used for communication between threads, all data write operations in the shared area must be locked. Of course, read operations are not required ~
The common usage is as follows:
Pthread_mutex_lock (& mutex); //... // pthread_mutex_unlock (& mutex );
During lock competition, which thread will win when the mutex lock is used? This problem involves thread priority scheduling. If priority scheduling is not set
The lock is random, that is, unpredictable.
Mutual Exclusion lock and conditional lock used together:
Many of the conditional Lock operation functions are related to mutex locks and need to be used together. If only mutex locks are used, as mentioned above, priority scheduling is not used.
In this case, the thread may be unpredictable to obtain the lock. from another point of view, we cannot achieve communication between specified threads. For example, after thread a completes, You need to specify a line B to complete a part.
Work, if only mutex lock is used, this cannot be completed, because it cannot be guaranteed that after thread a releases the lock, B can immediately obtain the lock. Therefore, conditional locks are required.
The condition lock is generally used as follows:
Void * thread_work_func1 (void * parm) {for (;) {pthread_mutex_lock (& mutex); If (XXXX) {pthread_cond_signal (& condition );} else {//....} pthread_mutex_unlock (& mutex) ;}} void * thread_work_fun2 (void * parm) {for (;) {pthread_mutex_lock (& mutex); pthread_cond_wait (& condition, & mutex ); // do something... pthread_mutex_unlock (& mutex );}}
As you need to read the glib source code later, some of the threads are about pthread, So let's review it. In the subsequentArticle, I will introduce pthread again.
We will consider writing more details.