C语言中如何进行并发编程?

  • Post category:C

C语言是一种比较底层的编程语言,其并发编程的方式可以基于线程或者进程进行实现。在并发编程中,我们通常都需要用到线程或进程之间的同步、互斥和通信机制,以保证程序的正确性和稳定性。

以下是一些常用的并发编程技术:

  1. 线程库

C语言中用于线程操作的库有POSIX线程库(pthread.h)和Win32线程库(windows.h)。您可以使用这些库来创建和管理线程,进行线程同步和线程通信。

  1. 信号

信号是一种异步通信机制,用于向进程发送通知。您可以使用signal()函数来注册信号处理程序,并在发生信号时执行相应的程序代码。

  1. 互斥量

互斥量是一种同步机制,只允许一个线程访问共享资源。您可以使用互斥量来避免多个线程同时访问同一共享资源。

下面是两个示例,演示如何使用互斥量来确保线程安全:

示例1:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* thread_func(void* arg)
{
    pthread_mutex_lock(&mutex);

    // critical section
    printf("Thread %d is executing critical section.\n", *(int*)arg);

    pthread_mutex_unlock(&mutex);

    return NULL;
}

int main()
{
    pthread_t thread1, thread2;
    int thread1_id = 1, thread2_id = 2;

    pthread_create(&thread1, NULL, thread_func, (void*)&thread1_id);
    pthread_create(&thread2, NULL, thread_func, (void*)&thread2_id);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    return 0;
}

示例2:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int shared_variable = 0;

void* thread_func(void* arg)
{
    for (int i = 0; i < 100000; i++)
    {
        pthread_mutex_lock(&mutex);

        // critical section
        shared_variable++;

        pthread_mutex_unlock(&mutex);
    }

    return NULL;
}

int main()
{
    pthread_t thread1, thread2;

    pthread_create(&thread1, NULL, thread_func, NULL);
    pthread_create(&thread2, NULL, thread_func, NULL);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    printf("The value of shared_variable is %d.\n", shared_variable);

    return 0;
}

这两个示例都使用了互斥量来确保线程安全。示例1展示了一个简单的临界区,只有一个线程可以访问。示例2展示了一个累加器,多个线程可以并发访问。在这个示例中,我们需要确保多个线程不会同时访问同一个共享变量,否则会导致结果不正确。

总之,在C语言中进行并发编程需要谨慎对待,必须使用正确的同步、互斥和通信机制来确保程序的正确性和稳定性。