LINUX线程同步初探

0x00.什么是线程同步
    同步,又称直接制约关系,是指多个线程(或进程)为了合作完成任务,必须严格按照规定的 某种先后次序来运行

0x01.案例代码

 1 void* PthreadFunc(void* argc);
 2 int flag_num = 1;
 3
 4 int main(int argc, char* argv[])
 5 {
 6     pthread_t pid;
 7     void* ret_val;
 8
 9     int create_status = pthread_create(&pid, NULL,  &PthreadFunc, NULL);
10     if(0 != create_status)
11     {      perror("main()->pthread_create error");
12         exit(1);
13     }
14
15     //input data to public source area
16     for(int i = 0;  i < 10; ++i)
17     {
18         if(flag_num == 1)
19         {
20             printf("1");
21             flag_num = 2;
22         }else{
23             sleep(1);
24         }
25     }
26
27     int join_status = pthread_join(pid, &ret_val);
28     if(0 != join_status)
29     {
30         perror("main()->pthread_join error");
31         exit(1);
32     }
33
34     //print array‘s data
35     for(int i = 0; i < 10; ++i)
36     {
37         printf("%d  ", arr[i]);
38     }
39
40     return 0;
41 }
42
43 void* PthreadFunc(void* argc)
44 {
45         if(flag_num == 2)
46         {
47             printf("2");
48             flag_num = 1;
49         }else{
50             sleep(1);
51         }
52 }

执行结果:
  [email protected]:~/projects/proj$ ./syn
  1212121212

结论:利用条件避免无休止抢占公共资源

0x02.修改代码获取新知识点 …(⊙_⊙;)

 1 void* PthreadFunc(void* argc);
 2 int arr[10];
 3
 4 int main(int argc, char* argv[])
 5 {
 6     pthread_t pid;
 7     void* ret_val;
 8
 9     int create_status = pthread_create(&pid, NULL,  &PthreadFunc, NULL);
10     if(0 != create_status)
11     {      perror("main()->pthread_create error");
12         exit(1);
13     }
14
15     //input data to public source area
16     for(int i = 0;  i < 10; ++i)
17     {
18         arr[i] = i;
19     }
20
21     int join_status = pthread_join(pid, &ret_val);
22     if(0 != join_status)
23     {
24         perror("main()->pthread_join error");
25         exit(1);
26     }
27
28     //print array‘s data
29     for(int i = 0; i < 10; ++i)
30     {
31         printf("%d  ", arr[i]);
32     }
33
34     return 0;
35 }
36
37 void* PthreadFunc(void* argc)
38 {
39     for(int i = 0;  i < 10; ++i)
40     {
41         arr[i] = i + 10;
42     }
43 }

执行代码结果:
[email protected]:~/projects/proj$ ./syn
10 11 12 13 14 15 16 17 18 19

  当时出现结果一脸懵,后来查资料发现了线程是有优先级的:main(for()) 属于主线程,PthreadFunc(for())属于子线程、

  主线程的优先级大于子线程,所以main.for()先对arr进行了数据写入,pthread.for()后写入数据,输出结果为线程输入数据

时间: 2024-12-13 08:37:56

LINUX线程同步初探的相关文章

使用信号量控制Linux线程同步

线程同步 在现实生活中,有些东西就必须是按顺序执行的,只有我完成了以后,你才能在我的劳动成果上接着干:不能我还没有完成,你就开始干活了.这就是线程同步最直白的解释了. 在进行程序设计时,亦是如此.线程同步,同步的是什么?它同步的是对共享资源(内存区域,公共变量等)或者临界区域的访问.有的时候,这些共享 资源和临界区域,就只能容忍一个线程对它进行操作(读或者写,读操作一般不控制,主要是写操作),这个时候,我们必须要对这些共享资源或者临界区域进行同 步,那么如何对它们进行线程同步呢? 在Linux中

【转】 Linux 线程同步的三种方法

线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同步. 初始化锁.在Linux下,线程的互斥量数据类型是pthread_mutex_t.在使用前,要对它进行初始化.静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;动态分配:int pthread_mutex_init(pthread_m

linux线程同步(队列方式)

看了一些关于信号量的线程同步方式,今天用了一下. 我对于线程同步一直有疑问,在主线程和子线程处理时间不相同的时候,用这种信号量,如何保证同步. 假如主线程比较快,信号量连加了n个,但是子线程就不断减这个n,减到0.但是如果主线程太快太快,需要停一停,比如缓冲区快溢出了,主线程需要挂起. 由什么来唤醒主线程呢?子线程?不过这样的话,容易造成主线程死锁,或者主和子都卡死. 下面的程序,没有用到信号量同步,信号量只是负责开启子线程而已.主要是队列的实现而已.等我把上面的问题解决完会写上更新的程序. 队

Linux线程同步

线程同步-互斥锁 1.初始化互斥锁pthread_mutex_init() int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); 例: pthread_mutex_t mutex; pthread_mutex_init(&mutex, NULL); 2.锁住互斥锁pthread_mutex_lock() int pthread_mutex_lock(pt

Linux线程同步---信号量

首先讲一下线程同步信号量的几个关键步骤! 1.定义并初始化信号量. (1) sem_t bin_sem; (2)  res = sem_init(&bin_sem,0,0); 详细步骤可以查看man帮助页面 2.使用信号量 (1) 信号量加1操作.sem_post(&bin_sem); (2) 信号量等待并减1操作.sem_wait(&bin_sem); 初始化后一般处于等待状态,执行某个操作后加1,而另个一个操作执行前进行等待操作.如果有多个线程,通常是一个线程进行加1操作,另外

Linux 线程同步的三种方法(互斥锁、条件变量、信号量)

互斥锁 1 #include <cstdio> 2 3 #include <cstdlib> 4 5 #include <unistd.h> 6 7 #include <pthread.h> 8 9 #include "iostream" 10 11 using namespace std; 12 13 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 14 15 int tmp; 16

Linux线程同步------屏障

屏障是Linux中协调多个线程并行工作的同步机制,屏障允许每个线程等待直到所有的合作线程到达某一点,然后继续从该点执行,pthread_join是一种屏障但只允许一个线程等待,pthread_barrier允许任意数量的线程等待! pthread_barrier_init(pthread_barrier_t *屏障,属性,unsigned int 屏障计数值): pthread_barrier_wait(pthread_barrier_t *屏障):在每个线程中调用则计数值加一并将当前线程阻塞在

linux线程同步实例

[Linux多线程]三个经典同步问题 - 神奕的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/lisonglisonglisong/article/details/45390227 Linux多进程多线程互斥同步例子_Linux编程_Linux公社-Linux系统门户网站 http://www.linuxidc.com/Linux/2013-01/78394.htm UNIX/Linux-线程控制(实例入门篇) - 菜鸟的自留地- 博客频道 - CSDN.N

linux 线程同步(二)

信号量 信号量是互斥锁的升级版把互斥锁中1变成了n,举个简单的例子:假设现在有10个人,有一部手机,这10个人都竞争来使用手机打电话这就是互斥锁.对于信号量,现在可能是有4部手机,这10个人都竞争来使用手机打电话.相比互斥锁信号量由1变成了4.信号量相也就是操作系统中pv操作,它广泛应用进程或者线程间的同步与互斥. 相关库函数介绍 #include <semaphore.h>//所需头文件 //初始化信号量sem初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享value表示要信号