给线程一个顺序(及线程的同步)
信号量(线程同步)
头文件
#include <semaphore.h>
信号量的初始化:
int sem_init(sem_t *sem, int pshared, unsigned int value);
return: 0成功 -1失败
sem_t *sem: 要初始化的信号量
int pshared: 0表示线程间 1表示进程
unsigned int value: 初始化信号的资源数
p操作:
sem_wait
申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1 ,程序继续执行
v操作:
sem_post
V操作:释放资源,对应资源+1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
/*
按顺序输出我是1我是2不会乱序。
*/
sem_t rt, dt;//定义两个信号量
void *fun_1(void *arg)//线程1
{
char *p = (char *)arg;
while(1)
{
//申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1,程序继续执行
sem_wait(&rt);
puts(p);
sleep(1);
//释放资源,对应资源+1
sem_post(&dt);
}
}
void *fun_2(void *arg)//线程2
{
char *p = (char *)arg;
while(1){
//申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1,程序继续执行
sem_wait(&dt);
puts(p);
sleep(1);
//释放资源,对应资源+1
sem_post(&rt);
}
}
int main()//main函数内为主线程,主线程在运行子线程才能正常运行。
{
pthread_t tid_1;
pthread_t tid_2;
if(0 != pthread_create(&tid_1, NULL, fun_1, "I am one!")){
perror("pthread_create1");
return -1;
}
if(0 != pthread_create(&tid_2, NULL, fun_2, "I am two!")){
perror("pthread_create1");
return -1;
}
//初始化信号量
if(0 != sem_init(&rt, 0, 1))//给rt分配1个资源
{
perror("sem_init");
return -1;
}
if(0 != sem_init(&dt, 0, 0))//给dt分配0个资源
{
perror("sem_init");
return -1;
}
while(1)
{
sleep(3);
}
}
注意:多线程程序在编译的时候需要链接对应的库-lpthread