



不同的操作系统有不同的实现方式:
详情可见操作系统书籍中的存储器管理和虚拟存储器管理章节!!!!




!!!!!!!!!!同⼀地址空间,因此 Text Segment 、 Data Segment 都是共享的,如果定义⼀个函数,在各线程中都可以调⽤ ,如果定义⼀个全局变量,在各线程中都可以访问到, 除此之外,各线程还共享以下进程资源和环境:
⽂件描述符表 (fd)当前⼯作⽬录⽤⼾id和组id1.父子进程只有代码段是共享的,但主线程和子线程连地址空间都是共享的,所以他们可以使用共享的函数和全局变量 (意思就是如果子线程的全局变量被修改了,主线程看到的是同一个全局变量,也会变化)
轻松实现类似进程间通信!!!!!!!2.而全局变量在父子进程中是写实拷贝,子变父不变!!!!!!!!!

创建函数:

运行后使用 ps - aL指令查看线程


pthread_”打头的
• 要使⽤这些函数库,要通过引⼊头⽂件 <pthread.h>
• 链接这些线程函数库时要使⽤编译器命令的“-lpthread”选项


1-----------------pthread_exit()

2-----------------pthread_cancel()


1.--------------------------pthread_self函数获取id

2.--------------------------pthread库的动态链接



来看一个买票的例子:
/ 操作共享变量会有问题的售票系统代码
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int ticket = 100;
void* route(void* arg) {
char* id = (char*)arg;
while (1) {
if (ticket > 0) {
usleep(1000);
printf("%s sells ticket:%d\n", id, ticket);
ticket--;
} else {
break;
}
}
}
int main(void) {
pthread_t t1, t2, t3, t4;
pthread_create(&t1, NULL, route, (void*)"thread 1");
pthread_create(&t2, NULL, route, (void*)"thread 2");
pthread_create(&t3, NULL, route, (void*)"thread 3");
pthread_create(&t4, NULL, route, (void*)"thread 4");
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_join(t3, NULL);
pthread_join(t4, NULL);
}
锁 来保证线程间的互斥
#include <pthread.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int ticket = 100;
pthread_mutex_t mutex;//设置锁
void* route(void* arg)
{
char* id = (char*)arg;
while (1)
{
pthread_mutex_lock(&mutex);//pthread_mutex_lock--------上锁
if (ticket > 0) {
usleep(1000);
printf("%s sells ticket:%d\n", id, ticket);
ticket--;
pthread_mutex_unlock(&mutex);// pthread_mutex_unlock--------解锁
} else {
pthread_mutex_unlock(&mutex);// pthread_mutex_unlock--------解锁
break;
}
}
return nullptr;
}
int main(void) {
pthread_t t1, t2, t3, t4;
pthread_mutex_init(&mutex, NULL);
pthread_create(&t1, NULL, route, (void*)"thread 1");
pthread_create(&t2, NULL, route, (void*)"thread 2");
pthread_create(&t3, NULL, route, (void*)"thread 3");
pthread_create(&t4, NULL, route, (void*)"thread 4");
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_join(t3, NULL);
pthread_join(t4, NULL);
pthread_mutex_destroy(&mutex);//pthread_mutex_destroy-------删除锁
}