一、创建五个线程,分别打印出自己是第几个被创建出来的
1.创建五个线程,每个打印三次,主程序等待线程运行完退出。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
void* fun(void*arg)
{
int index=*(int*)arg;
//for(int i=0;i<3;i++)
{
printf("inex=%d\n",&index);
sleep(1);
}
}
int main()
{
pthread_t id[5];
int i=0;
for(;i<5;i++)
{
pthread_create(&id[i],NULL,fun,(void*)&i);
}
for(i=0;i<5;i++)
{
pthread_join(id[i],NULL);
}
exit(0);
}
//运行结果
//按道理应该输出0-4,(也有可能出现0-4)
//还会有其他的结果,
多次输出结果并不唯一
//为什么会出现这样的结果?
i在主线程中一直在被修改
int main()
{
pthread_t id[5];
int i=0;
for(;i<5;i++)
{
pthread_create(&id[i],NULL,fun,(void*)&i);
}
for(i=0;i<5;i++)//i不断改变
{
pthread_join(id[i],NULL);
}
exit(0);
}两次for循环都会改变i的值,所以i才会呈现出上面的结果
//加入循环的结果
2.int 1=1;五个线程,每个线程对i++1000次,最后i为几
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
int m_val=1;
void* fun(void* arg)
{
int i=0;
for(;i<1000;i++)
{
printf("m_val=%d\n",m_val++);
}
}
int main()
{
pthread_t id[5];
int i=0;
for(;i<5;i++)
{
pthread_create(&id[i],NULL,fun,NULL);
}
for(i=0;i<5;i++)
{
pthread_join(id[i],NULL);
}
exit(0);
}
//结果有可能最后一个值不是5000,这是为什么?
计算机不能直接执行main.c
//汇编就是将代码转换为机器指令
//程序由一条条指令构成
//执行vim test2
答:一个i++由多条指令组成,(读取i的值;++;写入i的值)
两个路径同时对i进行++(一个正在+,还没完成,另一个也开始+),那么i的值只+1,最终结果就为4999;
//如果计算机只有一个处理器,那么i为多少?
i=5000
不能进行两个路径同时对i进行++,某一条路径在++的时候,其他的路径等待
会造成什么危害?
如果是减法,卖票可能会出现一张票卖给两个人,
如何解决这个问题
对多线程进行同步;
方法:
信号量:定义一个信号量 值为1,只能有一个抢到资源
互斥锁、条件变量、读写锁