1. 多线程的概念
在计算机科学中,线程是其运行中的最小单元。单个进程中可以有多个线程同时执行,并且可以共享进程的资源。多线程程序可以提高程序的效率,特别是在多核处理器系统中。
传统上,Linux在编程时使用系统调用fork()创建子进程,但子进程较大,创建子进程的开销较大。从2.0版本开始,Linux提供了使用pthread库编写多线程程序的方法,这个方法对于Linux下C语言多线程编程非常有用。
2. 多线程程序实例
2.1 编写多线程程序的基本步骤
要在Linux下编写多线程程序,请按照以下步骤进行:
1. 导入pthread库头文件。
2. 根据需要定义线程函数。线程函数必须返回void指针,并接受void指针作为参数。
3. 在主程序中使用pthread_create()函数创建线程。
4. 启动线程。pthread_create()函数基本用法如下:
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void*), void *restrict arg);
其中,第一个参数是一个指向pthread_t类型变量的指针,pthread_t用于存储线程ID。第二个参数指向线程的属性,如果指针为空,则使用默认属性。第三个参数是函数指针,指向线程函数。第四个参数是传递给线程函数的参数。如果线程函数不需要参数,则为NULL。
2.2 多线程程序的示例程序
下面的程序是一个简单的多线程程序,在主线程中创建另外两个线程,后者将输出信息到屏幕上。
#include <stdio.h>
#include <pthread.h>
void *thread1(void *arg)
{
printf("This is thread1. \n");
}
void *thread2(void *arg)
{
printf("This is thread2. \n");
}
int main()
{
pthread_t tid1, tid2;
if(pthread_create(&tid1,NULL,thread1,NULL)!=0)
printf("Create thread1 failed! \n");
if(pthread_create(&tid2,NULL,thread2,NULL)!=0)
printf("Create thread2 failed! \n");
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
程序运行后,你会看到以下输出:
This is thread1.
This is thread2.
以上输出表明,程序创建了两个线程,并且让它们依次执行而不发生冲突。
3. 多线程程序的注意事项
尽管多线程可以提高程序的效率,但它不是没问题的。尤其是在编写多线程程序时,需要注意以下事项:
3.1 线程安全
在多线程编程时,应该确保线程安全。线程安全是指,多个线程可以同时调用同一个函数或变量而不产生冲突。因此,需要考虑多个线程之间使用同一个函数或变量的情况。
3.2 MUTEX
MUTEX是一种同步原语,它可以确保任意时刻只有一个线程访问共享数据。在Linux下,MUTEX的使用非常重要。可以使用pthread_mutex_init()和pthread_mutex_lock()函数实现MUTEX,使用pthread_mutex_unlock()函数释放MUTEX。
3.3 死锁
死锁是指两个或多个线程被阻止并等待其他线程或资源。因此,在编写多线程程序时,应该避免产生死锁情况。
4. 总结
本文展示了如何在Linux下编写C语言多线程程序。其基本步骤是包含pthread库头文件,定义线程函数,使用pthread_create()函数创建线程,启动线程。同时介绍了多线程程序编写中需要注意的事项,以及如何使程序线程安全并处理MUTEX和死锁问题。