在Linux环境下,C语言的多线程编程是一项非常实用的技术,它允许程序同时执行多个任务,提高了程序的效率和响应速度,下面将通过一个具体的实例来详细展示如何在Linux下进行C语言的多线程编程。
实例:创建两个线程实现对一个数的递加
1、代码实现
需要包含必要的头文件,并定义一些全局变量和宏:
#include <pthread.h> #include <stdio.h> #include <sys/time.h> #include <string.h> #define MAX 10
定义两个线程函数thread1
和thread2
,它们都对全局变量number
进行递增操作,并在每次递增后打印当前的值:
void *thread1() { printf("thread1 : I'm thread 1 "); for (int i = 0; i < MAX; i++) { printf("thread1 : number = %d ", number); pthread_mutex_lock(&mut); number++; pthread_mutex_unlock(&mut); sleep(2); } printf("thread1 :主函数在等我完成任务吗? "); pthread_exit(NULL); } void *thread2() { printf("thread2 : I'm thread 2 "); for (int i = 0; i < MAX; i++) { printf("thread2 : number = %d ", number); pthread_mutex_lock(&mut); number++; pthread_mutex_unlock(&mut); sleep(3); } printf("thread2 :主函数在等我完成任务吗? "); pthread_exit(NULL); }
定义thread_create
函数来创建这两个线程,并检查线程是否成功创建:
void thread_create(void) { int temp; memset(&thread, 0, sizeof(thread)); if ((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) printf("线程1创建失败! "); else printf("线程1被创建 "); if ((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) printf("线程2创建失败 "); else printf("线程2被创建 "); }
定义thread_wait
函数来等待这两个线程结束,并打印相应的信息:
void thread_wait(void) { if (thread[0] != 0) { pthread_join(thread[0], NULL); printf("线程1已经结束 "); } if (thread[1] != 0) { pthread_join(thread[1], NULL); printf("线程2已经结束 "); } }
在main
函数中初始化互斥锁,调用thread_create
创建线程,然后调用thread_wait
等待线程结束:
int main() { pthread_mutex_init(&mut, NULL); printf("我是主函数哦,我正在创建线程,呵呵 "); thread_create(); printf("我是主函数哦,我正在等待线程完成任务阿,呵呵 "); thread_wait(); return 0; }
2、编译运行:将上述代码保存为thread_example.c
,然后在终端中使用以下命令进行编译和运行:
gcc -lpthread -o thread_example thread_example.c ./thread_example
运行结果将显示两个线程交替递增number
的值,并在每个线程结束时打印相应的信息。
FAQs
1、问:为什么在递增number
时需要使用互斥锁?
答:在多线程编程中,多个线程可能会同时访问和修改共享资源(如本例中的number
变量),这可能导致数据竞争和不一致的问题,互斥锁(Mutex)是一种同步机制,它可以确保在同一时刻只有一个线程能够访问共享资源,从而避免数据竞争和保证数据的一致性。
2、问:如何确定线程是否成功创建?
答:在创建线程时,pthread_create
函数会返回一个整数值,如果返回值为0,则表示线程成功创建;如果返回值不为0,则表示线程创建失败,可以通过检查pthread_create
的返回值来确定线程是否成功创建。