15.请阐述什么是可重入的程序,什么是线程安全的程序?编写可重入的程序和线程序安全的程序分别要遵守哪些规则?
时间: 2024-05-05 16:17:29 浏览: 6
可重入的程序是指一个函数或者子程序可以被多个任务或线程同时调用,而不会出现互相干扰或者竞争资源的情况。线程安全的程序是指在多线程环境下,程序的执行结果和单线程环境下执行结果一致。
编写可重入的程序需要遵守以下规则:
1. 避免使用全局变量和静态变量,因为它们可能被多个任务或线程同时访问。
2. 避免使用非可重入的函数,如strtok()、scanf()等,因为它们会修改全局变量或者静态变量,导致干扰其他任务或线程。
3. 使用局部变量或者参数传递数据,以避免资源竞争。
4. 使用信号量、互斥量等同步机制来保护共享资源。
编写线程安全的程序需要遵守以下规则:
1. 避免数据竞争,使用互斥量、读写锁等同步机制来避免多个线程同时访问同一数据。
2. 避免死锁,使用锁的顺序和释放的顺序保持一致。
3. 使用线程本地存储(TLS)来避免多个线程同时访问同一变量。
4. 避免竞争条件,使用原子操作、条件变量等同步机制来保护共享资源。
5. 避免使用非线程安全的函数,如rand()、strtok()等。
示例代码:
可重入的程序:
```
int add(int x, int y)
{
int sum = x + y;
return sum;
}
```
线程安全的程序:
```
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* thread_func(void* arg)
{
pthread_mutex_lock(&mutex);
// do something
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);
return 0;
}
```