笔记:https://note.youdao.com/ynoteshare1/index.html?id=1b529d966d34b16f3bdd828be48364e4&type=note
目录
1、任务:用户从终端输入任意字符然后统计个数显示,输入end则结束
3、使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数
一.线程同步之信号量
1、任务:用户从终端输入任意字符然后统计个数显示,输入end则结束
int main(void) { char buf[100] = {0}; printf("请输入一个字符串,以回车结束\n"); while(scanf("%s",buf)) { //去比较输入的是否为end,是则退出,不是则继续 if(strncmp(buf,"end",3)==0) { printf("程序结束\n"); return 0; } printf("本次输入了%d个字符\n",strlen(buf)); memset(buf,0,sizeof(buf)); } return 0; } |
2、信号量的介绍和使用(多线程实行的引入)
与进程一样,线程也可以使用信号量来通信。线程使用信号量同步线程的步骤如下:
-
(1)、信号量初始化
int sem_init (sem_t *sem , int pshared, unsigned int value);
对sem指定的信号量进行初始化,pshared:设置好共享选项(linux只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。
-
(2)、等待信号量
int sem_wait(sem_t *sem);
给信号量减1,然后等待直到信号量的值大于0。
-
(3)、释放信号量
int sem_post(sem_t *sem);
信号量值加1。并通知其他等待线程。
-
(4)、销毁信号量
int sem_destroy(sem_t *sem);
3、使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数
E:\Linux\3.AppNet\6.thread\6.3
char buf[100] = {0}; sem_t sem; unsigned int flag=0;
void *func(void *arg)//子线程计数 { //子线程首先应该有个循环 /*循环中阻塞在等待主线程激活的时候,子线程被激活后就去获取buf中的字符长度,然后打印,完成后再次阻塞*/ while(flag==0) { //②等待信号量,信号量没来之前一直阻塞在这里 sem_wait(&sem); printf("本次输入了%d个字符\n",strlen(buf)); memset(buf,0,sizeof(buf));//清除buf sem_wait(&sem); } pthread_exit(NULL);//线程终止 }
int main(void) { pthread_t th = -1; int ret = -1; //①信号量初始化 sem_init (&sem , 0, 0); /* 创建线程 */ ret = pthread_create(&th, NULL, func, NULL); if(ret !=0) { perror("pthread_create error.\n"); return -1; } printf("请输入一个字符串,以回车结束\n"); while(scanf("%s",buf)) { |