线程的创建:C语言中使用pthread_create函数创建线程,即 ret = pthread_create(&th, NULL, func, NULL);其中th为:pthread_t th = -1;func为线程函数名。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
//定义全局变量buf,在主线程与子线程之间共享
char buf[200] = {0};
//定义信号量
sem_t sem;
// 子线程程序,作用是统计buf中的字符个数并打印
void *func(void *arg)
{
// 子线程首先应该有个循环
// 循环中阻塞在等待主线程激活的时候,子线程被激活后就去获取buf中的字符
// 长度,然后打印;完成后再次被阻塞
//阻塞等待主线程的信号
sem_wait(&sem);
//strncmp作用是比较buf中的字符是否为end
while (strncmp(buf, "end", 3) != 0)
{
printf("本次输入了%d个字符\n", strlen(buf));
//每次用完后清空,方便下一次输入
memset(buf, 0, sizeof(buf));
sem_wait(&sem);
}
//线程退出
pthread_exit(NULL);
}
int main(void)
{
int ret = -1;
pthread_t th = -1;
//信号量的初始化
sem_init(&sem, 0, 0);
//创建线程
ret = pthread_create(&th, NULL, func, NULL);
if (ret != 0)
{
printf("pthread_create error.\n");
exit(-1);
}
printf("输入一个字符串,以回车结束\n");
while (scanf("%s", buf))
{
// 去比较用户输入的是不是end,如果是则退出,如果不是则继续
//strncmp函数返回0则表示与buf中的值相等,也可用if(strncmp(buf,"end",3)==0)
if (!strncmp(buf, "end", 3))
{
printf("程序结束\n");
sem_post(&sem);
//exit(0);
break;
}
// 主线程在收到用户收入的字符串,并且确认不是end后
// 就去发信号激活子线程来计数。
// 子线程被阻塞,主线程可以激活,这就是线程的同步问题。
// 信号量就可以用来实现这个线程同步
sem_post(&sem);
}
// 回收子线程
printf("等待回收子线程\n");
ret = pthread_join(th, NULL);
if (ret != 0)
{
printf("pthread_join error.\n");
exit(-1);
}
printf("子线程回收成功\n");
//销毁信号
sem_destroy(&sem);
return 0;
}
需要注意的点,子线程要有循环,不然执行一次就结束了,一定要在前面加信号阻塞。线程用完一定要回收使用pthread_join(th,NULL)函数。最后还要销毁信号sem_destroy(&sem)