C语言是一种比较底层的编程语言,其并发编程的方式可以基于线程或者进程进行实现。在并发编程中,我们通常都需要用到线程或进程之间的同步、互斥和通信机制,以保证程序的正确性和稳定性。
以下是一些常用的并发编程技术:
- 线程库
C语言中用于线程操作的库有POSIX线程库(pthread.h)和Win32线程库(windows.h)。您可以使用这些库来创建和管理线程,进行线程同步和线程通信。
- 信号
信号是一种异步通信机制,用于向进程发送通知。您可以使用signal()函数来注册信号处理程序,并在发生信号时执行相应的程序代码。
- 互斥量
互斥量是一种同步机制,只允许一个线程访问共享资源。您可以使用互斥量来避免多个线程同时访问同一共享资源。
下面是两个示例,演示如何使用互斥量来确保线程安全:
示例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语言中进行并发编程需要谨慎对待,必须使用正确的同步、互斥和通信机制来确保程序的正确性和稳定性。