C语言中的多线程编程

如何创建线程:

我门使用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);

}
  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值