php中文网

C语言多线程编程中信号量的使用

php中文网

信号量在多线程编程中用于协调对共享资源的访问,它使用整数变量表示可用资源数量,并提供 wait() 和 signal() 两个基本操作:wait():当没有可用的资源时阻塞线程,当资源可用时减少信号量的值并允许线程继续执行。signal():增加信号量的值,表示又有一个资源可用。

C 语言多线程编程中信号量的使用

简介

信号量是一种同步机制,用于在多线程环境中协调对共享资源的访问。它使用一个整数变量来表示可用的资源数量,并且提供了两个基本操作:wait() 和 signal()。

创建信号量

立即学习“C语言免费学习笔记(深入)”;

sem_t 数据类型用于表示信号量。它是一个指向信号量结构的指针。要创建信号量,可以使用 sem_init() 函数:

sem_t my_semaphore;
sem_init(&my_semaphore, 0, 1);

第一个参数是信号量的指针,第二个参数是信号量的初始值(表示可用的资源数量),第三个参数是操作系统指定的标志。

信号量的操作

  • sem_wait():当没有可用的资源时,该函数将阻塞线程。当资源可用时,它将减少信号量的值,并允许线程继续执行。
  • sem_post():该函数增加信号量的值,表示又有一个资源可用了。

实战案例

以下是一个使用信号量的线程安全计数器的示例:

#include <pthread.h>
#include <semaphore.h>

// 线程安全计数器
int counter = 0;
// 信号量用于保护计数器
sem_t counter_semaphore;

void *increment_thread(void *args) {
    while (1) {
        // 等待信号量
        sem_wait(&counter_semaphore);

        // 增量计数器
        counter++;

        // 释放信号量
        sem_post(&counter_semaphore);
    }
    return NULL;
}

int main() {
    // 初始化信号量
    sem_init(&counter_semaphore, 0, 1);

    // 创建两个增量线程
    pthread_t threads[2];
    for (int i = 0; i < 2; i++) {
        pthread_create(&threads[i], NULL, increment_thread, NULL);
    }

    // 让主线程睡眠一段时间,允许子线程运行
    sleep(1);

    // 打印计数器值
    printf("计数器:%dn", counter);

    return 0;
}

注意:在使用完信号量后,必须使用 sem_destroy() 函数销毁它。

以上就是C语言多线程编程中信号量的使用的详细内容,更多请关注php中文网其它相关文章!