C语言多线程编程中信号量的使用

信号量是C语言多线程的同步神器,就像停车场的管理员,控制车子的进出。
它用个数来表示资源,主要有两个操作:wait()和signal()。
wait()就像申请停车位,没车位就等着;signal()就像释放车位,有车来了。

在C里,信号量用sem_t表示,创建得用sem_init(),就像建个停车场。
例子里的计数器,我们用信号量保证它线程安全,防止两个线程同时改数。

记住,用完信号量要销毁,就像停车场不用了要拆掉,防止浪费资源。
设置初始值要合理,就像停车场大小得符合实际需求。

合理用信号量,就像管理好停车场,保证车子进出有序,程序稳定运行。

C语言怎么同时运行多个程序

说白了,C语言跑多个程序主要靠多进程和多线程两种方式。
多进程用fork()创建子进程,这玩意儿去年我们跑那个高并发项目时用得特别多,3 000量级下每个进程跑独立任务,但内存是隔离的,所以数据共享得靠管道或共享内存,说实话挺坑的。
另外一点,exec函数族能让你在子进程中直接换上新程序,比如execl()传参数启动另一个命令,这个点很多人没注意,忘了传环境变量就跪了。
还有个细节挺关键的,进程间切换开销大,去年测试时切换一次要几十微秒,但线程切换只要几纳秒,能省不少成本。

我一开始也以为多线程肯定比多进程快,后来发现不对,线程虽然快,但线程同步是个硬骨头,去年项目里因为没加锁直接写共享变量,整出死锁来差点酿大祸。
等等,还有个事,线程共享进程资源听着挺好,但线程间数据同步要靠互斥锁、信号量这些玩意儿,用不好就乱套了,比如信号量P/V操作顺序搞反了就歇菜。

我觉得值得试试的场景是,计算密集型任务用多线程,I/O密集型任务用多进程,资源管理这块,进程间要搞共享内存就麻烦,线程间用全局变量同步反而简单,但别忘加锁啊。