linux多线程示例


 1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <pthread.h>
5
6 typedef void* (*fun)(void*);
7
8 fun fun1, fun2;
9
10 pthread_mutex_t pmu = PTHREAD_MUTEX_INITIALIZER;
11 pthread_cond_t cond;
12 pthread_t pid1, pid2;
13 int flag = 0;
14 int gnum = 0;
15 int gsub = 100;
16
17 void * func1(void * para)
18 {
19 int k = (int)para;
20 printf("func1, ******\n");
21 while(gnum<=100)
22 {
23 pthread_mutex_lock(&pmu);
24 printf("gnum == %d", gnum);
25 while(gnum==50)
26 {
27 printf("suspend thread1 at gnum==50 !!! \n");
28 pthread_cond_wait(&cond, &pmu);
29 gnum++;
30 }
31 ++gnum;
32 ++flag;
33 ++k;
34 //printf("flag = %d, k = %d\n", flag, k);
35 pthread_mutex_unlock(&pmu);
36 printf("I am func1\n");
37 }
38 pthread_exit((void*)0);
39
40 }
41
42 void * func2(void * para)
43 {
44 int f = (int)para;
45 printf("f == %d\n", f);
46 printf("pthread2 start running !\n");
47 void * ret = NULL;
48 while(gsub>=0)
49 {
50 pthread_mutex_lock(&pmu);
51 gsub--;
52 printf("gsub= %d ", gsub);
53 if(gsub == 20)
54 {
55 printf("now gsnb ==20, and send signal\n");
56 pthread_cond_signal(&cond);
57 }
58 ++flag;
59 ++f;
60 printf("flag = %d, f = %d\n", flag, f);
61 pthread_mutex_unlock(&pmu);
62 printf("I am func2 \n");
63 }
64 //pthread_join(pid1, &ret);
65 pthread_exit((void*)0);
66 }
67
68 int main()
69 {
70 int id = 0;
71 void * ret = NULL;
72 int key = 5;
73
74 pthread_cond_init(&cond, NULL); //属性设置NULL默认属性
75 id = pthread_create(&pid1, NULL, func1, (void*)key);
76 if(id != 0)
77 {
78 printf("pthread_create error !\n");
79 exit(0);
80 }
81
82 if(pthread_create(&pid2, NULL, func2, (void*)key))
83 {
84 printf("pthread_create error ! \n");
85 exit(0);
86 }
87 pthread_join(pid2, &ret);
88 pthread_join(pid1, &ret);
89 pthread_exit((void*)0);
90 }

gcc test_thread.c -lpthread
./a.out

linux多线程示例,布布扣,bubuko.com

时间: 2024-10-24 11:54:31

linux多线程示例的相关文章

Linux多线程编程-互斥锁

互斥锁 多线程编程中,(多线程编程)可以用互斥锁(也称互斥量)可以用来保护关键代码段,以确保其独占式的访问,这有点像二进制信号量.POSIX互斥锁相关函数主要有以下5个: #include <pthread.h> int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_destroy(pthread_mutex_t *mutex); int p

Linux多线程编程-条件变量

条件变量 如果说线程间的互斥锁是用来同步共享数据的访问的话,那么条件变量是用于线程之间共享数据的值.条件变量提供了一种线程之间的通知机制,当某个共享数据达到某个值时,唤醒等待这个共享数据的线程.条件变量相关函数主要 有5个: #include <pthread.h> int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_

Linux多线程

1. Linux多线程概述 1.1. 概述 进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段.这就造成进程在进行切换等操作时都需要有比较负责的上下文切换等动作.为了进一步减少处理器的空转时间支持多处理器和减少上下文切换开销,也就出现了线程. 线程通常叫做轻量级进程.线程是在共享内存空间中并发执行的多道执行路径,是一个更加接近于执行体的概念,拥有独立的执行序列,是进程的基本调度单元,每个进程至少都有一个main线程.它与同进程中的其他线程共享进程空间{堆 代码 数据

C++ Linux 多线程之创建、管理线程

线程就是,在同一程序同一时间内允许执行不同函数的离散处理队列. 这使得一个长时间去进行某种特殊运算的函数在执行时不阻碍其他的函数变得十分重要. 线程实际上允许同时执行两种函数,而这两个函数不必相互等待. 一旦一个应用程序启动,它仅包含一个默认线程. 此线程执行 main() 函数. 在 main()中被调用的函数则按这个线程的上下文顺序地执行. 这样的程序称为单线程程序. 反之,那些创建新的线程的程序就是多线程程序. 他们不仅可以在同一时间执行多个函数,而且这在如今多核盛行的时代显得尤为重要.

LINUX多线程(一)(创建和退出)

1. Linux多线程概述 1.1. 概述 进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段.这就造成进程在进行切换等操作时都需要有比较负责的上下文切换等动作.为了进一步减少处理器的空转时间支持多处理器和减少上下文切换开销,也就出现了线程. 线程通常叫做轻量级进程.线程是在共享内存空间中并发执行的多道执行路径,是一个更加接近于执行体的概念,拥有独立的执行序列,是进程的基本调度单元,每个进程至少都有一个main线程.它与同进程中的其他线程共享进程空间{堆 代码 数据

Linux多线程编程详解 [By: HarryAlex]

本文内容主要参考于<Linux程序设计·第3版>.<Linux环境C程序设计>.<C语言核心技术>.<深入理解计算机系统·第2版>,代码运行环境: Linux version 3.10.0-123.el7.x86_64 ([email protected]) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Thu Jun 4 17:17:49 CST 2015 1. Linux进程与

C Linux 多线程入门

C Linux 多线程入门 ××× 入门示例 ????启动和停止直接使用接口即可,暂停和恢复需要自己定义,大体的代码如下: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <signal.h> #include <sys/time.h> struct si

《Linux多线程编程手册》读书笔记

第二章 基本线程编程 1.(P25)如果多个线程等待同一个线程终止,则所有等待线程将一直等到目标线程终止.然后,一个等待线程成功返回,其余的等待线程将失败并返回ESRCH错误. 2.(P26)将新线程的pbe参数作为栈参数进行传递.这个线程参数之所以能够作为栈参数传递,是因为主线程会等待辅助线程终止.不过,首选方法是使用malloc从堆分配存储,而不是传递指向线程栈存储的地址.如果将该参数作为地址传递到线程栈存储,则该地址可能无效或者在线程终止时会被重新分配. 3.(P28)pthread_de

linux 多线程信号处理总结

linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知.也就是说,信号会随机发个该进程的一个线程. 2 signal函数BSD/Linux的实现并不在信号处理函数调用时,恢复信号的处理为默认,而是在信号处理时阻塞此信号,直到信号处理函数返回.其他实现可能在调用信号处理函数时,恢复信号的处理为默认方式,因而需要在信号处理函数中重建信号处理函数为我们定义的