Linux 多线程编程(二)2019-08-10

哎呀,说到这三种线程同步机制真是老生常谈了。
首先,我们来谈谈 POSIX 信号量。
Linux 中有两种类型:一种是 SystemV IPC 信号量,即 PV 操作,另一种是 POSIX 信号量,其名称以 sem_ 为前缀。

这个 POSIX 信号量有一个 phshared 参数。
如果为 0,则这是进程本地信号量并且不能共享。
如果非零,则可以在多个进程之间共享。
一般来说,sem_wait函数对应的还有一个value值,就是信号量的初始值。

回到sem_wait函数,这是一个原子操作,将信号量的值减1 如果信号量的值为0,则阻塞。
信号量的值可以在sem_init函数中初始化。

我们来谈谈sem_trywait函数,它是sem_wait的非阻塞版本。
sem_post函数是一个原子操作,它将信号量值加1 如果信号量值大于0,则唤醒其他等待线程。

然后是生产者-消费者模型。
生产者对应于信号量 sem_t Producer,消费者对应于信号量 sem_tcustomer。
sem_init(& Producer, 2 ) 表示生产者有资源可以使用, sem_init(& customer, 0) 表示消费者没有资源,应该被阻塞。

下面是pthread_mutex_t数据类型表示的互斥体。
在使用之前,必须使用pthread_mutex_init函数对其进行初始化。
使用后必须调用pthread_mutex_destroy释放内核资源。
pthread_mutex_lock 锁定互斥体。
如果锁已经上锁,则会被阻塞。
pthread_mutex_unlock 正在解锁。
如果另一个线程正在等待该锁,则其中一个线程可能会获得该锁。

条件变量是在线程之间同步共享数据的值。
它提供了线程间通信机制。
当共享数据达到一定值时,等待共享数据的线程被唤醒。
条件变量与互斥体一起使用,以允许线程以无竞争的方式等待特定条件的发生。

例如,pthread_cond_broadcast函数以广播格式唤醒所有等待目标条件变量的线程。
pthread_cond_signal 函数用于唤醒等待目标条件变量的线程。
有时你可能需要唤醒一个冻结的线程,这可以通过定义一个唯一标识目标线程的全局变量来实现。

最后,我们使用条件变量和互斥锁实现生产者-消费者模型。
这样做的结果是阻塞队列和生产者-消费者。
嗯,就是这样。

linux多线程编程?

当谈到Linux系统中的多线性规划时,这是一个常见的话题。
记得刚开始学习Linux编程时,多线程编程是让人又爱又恨的神秘宝藏。

首先我们要知道,多线程编程就是让程序同时运行在几个线程上,这样可以更有效地利用CPU,也可以提高程序的性能。
就像一个乐队。
不同的主题有不同的工具。
一起演奏可以产生更美妙的音乐。

说起流程,很简单。
首先,你必须创建一个线程,这需要pthread_create函数。
这个功能有点类似于万能钥匙,可以帮你打开线程的“门”。
你需要提供几个参数,比如一个存储线程ID的指针,一个线程属性(通常你不关心它),然后是线程想要运行的函数,也许还有传递给这个函数的参数。

线程创建后,程序开始运行。
有时你可能必须等待线程完成运行,在这种情况下需要使用 pthread_join 函数。
它就像一个看门人,等待线程运行完毕才关门。

但是,多行编程并不是那么有趣。
您应该注意线程之间的同步问题以及对共享数据的安全访问。
想象一下,如果多个线程同时修改相同的数据,结果将被破坏。
这时就应该使用互斥锁、实例变量等工具来避免死锁和数据不一致。

我以前也遇到过这样的问题。
我记得有一次我写了一个并发服务器。
结果,由于线程同步没有处理好,数据被破坏。
最后花了很多时间才解决。

一般来说,多行Linux编程是可以的,但是你必须会使用它。
你必须学习如何创建和运行线程、终止线程以及处理线程同步和数据安全问题。
就像厨师必须学习如何炒菜以及如何避免食物烧焦一样。
不过,只要掌握了技巧,多行编程就可以让你的程序运行得又快又稳定。

linux下多进程或者多线程编程的问题。新手,望指教!

哈,这两个问题涉及到进程和线程的创建和终止,有点复杂,不过我会尽量用简单的话给大家解释一下。

第一个问题,无论是创建进程还是线程,进程其实都很快,就像你点外卖,下单后不久就收到“订单已接受”的回复,但食物还没有准备好。
因此,创建进程或线程后,系统会立即告诉你已经“创建”了,但实际上进程或线程仍处于“生产中”状态,不会立即完成。

第二个问题,进程和线程的区别在于,进程就像一个独立的餐厅,有自己的厨房和服务员; 而线程就像餐厅里的一张桌子,可以共享厨房和服务员。

在多进程的情况下,如果父进程(父进程)先离开,那么它的子进程(子进程)将会被一个超级服务器(init进程)接管。
如果孩子先离开,父亲要检查一下孩子的情况,否则孩子可能会变成“僵尸”,占据空间不走。

对于多线程来说,如果主表(主线程)先结束,那么整个餐厅(进程)也会结束。
但如果主表提前离开并使用“提前退出”信号(pthread_exit),那么其他表(子线程)可以继续忙碌。

当子线程结束时,如果使用“提前退出”信号,那么只有它才会结束; 如果你使用“退出”信号(退出)或者正常结束,那么整个餐厅就会结束。
如果子线程结束但没有告诉其他线程“我已经离开了”,其他线程可以使用“pthread_join”函数进行确认,就像进程中的“wait”和“waitpid”一样,确认其他线程的情况,然后单独处理资源。

无论如何,这取决于你。
理解这些概念可能需要一些时间,所以慢慢来。
我还在思考这个问题。