不同的操作系统有不同的实现方式:
详情可见操作系统书籍中的存储器管理和虚拟存储器管理章节!!!!
!!!!!!!!!!
同⼀地址空间
,因此 Text Segment 、 Data Segment 都是共享的,如果定义⼀个函数,在各线程中都可以调⽤ ,如果定义⼀个全局变量,在各线程中都可以访问到, 除此之外,各线程还共享以下进程资源和环境:
⽂件描述符表 (fd)
当前⼯作⽬录
⽤⼾id和组id
1.父子进程只有代码段是共享的,但主线程和子线程连地址空间都是共享的,所以他们可以使用共享的函数和全局变量 (意思就是如果子线程的全局变量被修改了,主线程看到的是同一个全局变量,也会变化)
轻松实现类似进程间通信!!!!!!!
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-------删除锁
}