如何创建线程:
我门使用POSIX线程库pthread来创建线程
- 引入头文件<pthread.h>
-
#include <pthread.h>
-
-
定义线程的函数,创建一个函数作为线程的执行函数。
-
void *thread_function(void *arg){ //线程需要做什么事情 }
-
-
创建线程,使用‘pthread_create’函数
-
pthread_t thread_id; // 创建成功返回零,创建失败返回非零 int ret = pthread_create(&pthread_id, NULL, thread_function, NULL); if(ret != 0){ // 处理线程创建失败的情况 } // 第一个参数:用来存储新创建线程的ID // 第二个参数:线程的属性,一般为‘NULL’ // 第三个参数:指向线程函数的指针 // 第四个参数:传递给线程函数的参数
-
注:在编译链接时,需要加上'-pthread'参数以链接pthread库
互斥锁与自旋锁:
自旋锁(Spin Lock)和互斥锁(Mutex Lock)都是多线程编程中用于同步访问共享资源的机制。
自旋锁:
自旋锁是一种忙等待的锁机制,当线程尝试获取锁时,如果锁已经被其他线程占用,它会一直循环等待直到获取到锁为止。因此,自旋锁不会将线程置于休眠状态,而是一直占用CPU时间片进行等待。
自旋锁适用于锁的占用时间很短,且竞争情况不频繁的场景。在这种情况下,自旋等待的时间相对较短,能够更高效地避免线程切换带来的开销。
互斥锁:
互斥锁是一种阻塞的锁机制,当线程尝试获取锁时,如果锁已经被其他线程占用,该线程会被阻塞挂起,直到获取到锁为止。
互斥锁适用于锁的占用时间较长或竞争情况较频繁的场景。在这种情况下,使用互斥锁能够避免线程忙等待所带来的资源浪费,提高系统的整体效率。
主要区别:
自旋锁在等待锁时不会放弃 CPU,会一直尝试获取锁,而互斥锁在等待锁时会进入休眠状态,不会占用 CPU 资源。
自旋锁适用于锁的占用时间短、竞争不激烈的情况,而互斥锁适用于锁的占用时间长、竞争频繁的情况。
使用场景:
当锁的占用时间很短,且竞争情况不频繁时,可以使用自旋锁,以减少线程切换的开销。
当锁的占用时间较长,或者竞争情况较频繁时,应该使用互斥锁,以避免线程忙等待带来的资源浪费。
如何使用互斥锁(Mutex)
#include <pthread.h>
// 定义一把锁(互斥锁)
pthread_mutex_t mutex;
void *thread_function(void *arg){
// 加锁
pthread_mutex_lock(&mutex);
// 访问共享资源
// 解锁
pthread_mutex_unlock(&mutex);
return NULL;
}
int main(void){
// 在线程开始创建之前对锁进行初始化
ptherad_mutex_init(&mutex, NULL);
}
如何使用自旋锁(Spinlock)
#include <pthread.h>
// 定义一把锁(自旋锁)
pthread_spinlock_t spinlock;
void *thread_function(void *arg){
// 加锁
pthread_spin_lock(&spinlock);
// 访问共享资源
// 解锁
pthread_spin_unlock(&spinlock);
return NULL;
}
int main(void){
// 在线程开始创建之前对锁进行初始化
ptherad_spin_init(&spinlock, PTHREAD_PROCESS_SHARED);
}