1.进程是资源管理的最小单位,线程是程序执行的最小单位。
2.一个进程可以创建多个线程,而这些线程共享该进程资源。
3.线程必须依赖于进程,线程不可以独立存在。
4.一个线程执行所需要的资源远小于进程。
5.线程和进程可以并发执行,并且线程和进程共同竞争CPU。
一、单线程编程
在编译有线程代码时,必须显式的调用线程库:gcc xxx.c -o xxx -lpthread
线程在任何地方调用该函数,则线程结束:pthread_exit(void *retval),类似于进程中的exit()
为线程收尸,如果线程未结束,则阻塞:pthread_join(pthread_t thread, void **retval)
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
//线程体
void *func(void *arg)
{
//int a = *(int *)arg;
//printf("a = %d\n",a); //输出123
sleep(2);
printf("我是一个线程\n");
pthread_exit((void *)8); //类似于exit()
}
int main(void)
{
pthread_t tid;
int ret;
//创建线程
//param2:一般填NULL,线程的属性
//param3:线程的执行体 param4:线程的参数,即func的形参
//int a = 123;
//ret = pthread_create(&tid, NULL, func, (void *)&a);
ret = pthread_create(&tid, NULL, func, NULL);
if(0 != ret)
{
perror("pthread_create");
exit(1);
}
//usleep(1000);
void *tmp;
pthread_join(tid, &tmp);
printf("tmp = %d\n", (int)tmp); //输出8
//pthread_join(tid, NULL); //为线程收尸,如果线程没有结束,则阻塞
printf("我是主线程\n");
return 0;
}
二、多线程编程
线程间的信号量:posix信号量
同步:多个任务(线程)按照约定的顺序相互配合完成一件事
由信号量来决定线程是继续运行还是阻塞
信号量代表某一资源,其值表示系统中该资源的数量
int sem_init(sem_t *sem, int pshared, unsigned int value); //信号量初始化
int sem_wait(sem_t *sem); //P操作,信号量值为0,则阻塞
int sem_post(sem_t *sem); //V操作
int sem_trywait(sem_t *sem); //尝试P操作,如果信号量的值为0,则直接返回
int sem_getvalue(sem_t *sem, int *svalue); //获取信号量的值
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
struct sem_buf{
char buf[20];
sem_t sem;
};
void *func_input(void *arg)
{
struct sem_buf tmp = *(struct sem_buf *)arg;
while(1)
{
fgets(tmp.buf, 1024, stdin);
sem_post(&(tmp.sem));
}
}
void *func_process(void *arg)
{
char *p;
int count = 0;
struct sem_buf tmp = *(struct sem_buf *)arg;
while(1)
{
count = 0;
sem_wait(&(tmp.sem));
p = tmp.buf;
while(*p != '\0')
{
count++;
p++;
}
printf("input num:%d\n", --count);
}
}
int main(void)
{
pthread_t tid_input;
pthread_t tid_process;
int ret;
struct sem_buf info;
sem_init(&(info.sem), 0, 0);
ret = pthread_create(&tid_input, NULL, func_input, (void *)&info);
ret += pthread_create(&tid_process, NULL, func_process, (void *)&info);
if(ret != 0)
{
perror("pthread_create");
exit(1);
}
pthread_join(tid_input, NULL);
pthread_join(tid_process, NULL);
return 0;
}
此份代码只做参考模板,按理是没有问题,但我的虚拟机输出不了,不知道什么情况,还望大神指点,谢谢。