What Is a Thread?
Threading in programming is a concept of dividing a processor into smaller sections, with each section having its own thread. Each thread can perform tasks concurrently and can give out output at the same time. In C programming, threads are used to execute multiple concurrent operations within a single program. However, multiple threads accessing a shared resource simultaneously can cause unpredictable behavior and race conditions. Therefore, mutual exclusion (mutex) is used, which ensures that only one thread can access a shared resource at a time.
Using Mutexes in C Programming
A mutex is a synchronization object that acts like a lock, allowing only one thread to access a shared resource at a time. When a thread acquires a mutex, any other thread that attempts to access the same mutex will block until the mutex is released. This ensures that no more than one thread at a time is accessing a resource. In C, to use a mutex, we create a pthread_mutex_t object and initialize it using the pthread_mutex_init() function. We can then lock the mutex using pthread_mutex_lock() and unlock it using pthread_mutex_unlock().
For example, let's consider a simple program that counts to 100,000 using 12 threads. Without mutexes, the program produces random results because multiple threads are trying to increment the same variable simultaneously. However, when mutexes are used, only one thread can access the variable at a time, producing consistent and expected results.
The pthread_mutex_init() function initializes a mutex object. The first argument of this function is the address of the mutex object to be initialized, and the second argument is a pointer to a struct that specifies the attributes of the mutex. The function returns zero on success and a non-zero error code on failure.
领英推荐
The pthread_mutex_lock() function locks the mutex, which means that any other thread that attempts to access the same mutex will block until the mutex is released. The pthread_mutex_unlock() function unlocks the mutex, allowing other threads to access the shared resource.
The gettimeofday() function is used to get the current time and date with high precision. It takes two arguments: a pointer to a struct timeval object that will hold the current time and a struct timezone variable that can be set to NULL to indicate that the timezone information is not needed. The struct timeval object contains two fields: tv_sec and tv_usec. The tv_sec field holds the number of seconds since the Unix epoch (January 1, 1970), and the tv_usec field holds the number of microseconds within the current second. To convert tv_sec and tv_usec values to milliseconds, we can use * 1000 and / 1000, respectively.
Creating and Joining Threads in C Programming
The pthread_create() function is used to create a new thread in a multi-threaded program. It takes four arguments: a pointer to a pthread_t variable that will be used to store the thread ID of the new thread, a pointer to a pthread_attr_t variable that specifies the attributes of the new thread (this argument can be NULL, in which case default attributes are used), a pointer to a function that will be executed by the new thread (this function must have a single void* argument and return a void*), and an argument that will be passed to the function specified in the previous argument. The pthread_create() function returns zero on success, or an error code on failure.
Joining threads is a mechanism for synchronizing the execution of threads in a program. When a thread is joined, the program waits until that thread completes its execution before moving on to the next task. This ensures that all threads complete their work before the program terminates. The pthread_join() function is used to join a thread. It takes two arguments: the thread you want to wait for, and a pointer to void that