1.创建五个线程,每个打印三次,主程序等待线程运行完退出。
#include
#include
#include
#include
#includevoid* 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才会呈现出上面的结果
//加入循环的结果

#include
#include
#include
#include
#includeint 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,只能有一个抢到资源
互斥锁、条件变量、读写锁