一、实验目标
了解和掌握线程概念、Linux 系统线程创建
二、实验内容
1思路
创建两个线程,分别做累加和累减,然后运行1000次分别观察有pthread_join和没有的情况下线程的运行情况。
2.代码
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
int sum;
void * runner01(void * param);
void * runner02(void * param);
int main (int argc, char * argv[])
{
sum = 0;
pthread_t tid01;
pthread_t tid02;
pthread_attr_t attr;
if(argc != 2)
{
fprintf(stderr, "usage: a.out <integer value>\n");
return -1;
}
if(atoi(argv[1]) <= 0)
{
fprintf(stderr, "%d must be > 0\n", atoi(argv[1]));
return -1;
}
pthread_attr_init(&attr);
pthread_create(&tid01, &attr, runner01, argv[1]);
pthread_create(&tid02, &attr, runner02, argv[1]);
pthread_join(tid01, NULL);
pthread_join(tid02, NULL);
pthread_exit(0);
}
void * runner01(void * param)
{
int upper = atoi(param);
for (int i = 1; i <= upper; i++)
sum += i;
printf("[Thread 1] sum = %d\n", sum);
}
void * runner02(void * param)
{
int lower = atoi(param);
for (int i = 1; i <= lower; i++)
sum -= i;
printf("[Thread 2] sum = %d\n", sum);
}
3.过程及运行结果展示
编译运行 thread.c 程序
利用 thread.sh 脚本程序运行 thread 程序1000次,并查看每次运行结果是否一致
把 thread.c 程序改成先运行 runner01 线程之后,在运行 runner02 线程
三、实验结论
创建两个线程,分别做累加和累减,然后运行1000次分别观察有pthread_join和没有的情况下线程的运行情况:创建两个线程runner01和runner02,如果有join函数也就是阻塞至某一个线程执行完才能执行另一个线程,此时runner01线程始终先运行,但是如果没有join则两个线程会交替运行,产生不同的结果,因为此时操作系统调用线程的顺序是不可确定的。
附录:代码
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
int sum;
void * runner01(void * param);
void * runner02(void * param);
int main (int argc, char * argv[])
{
sum = 0;
pthread_t tid01;
pthread_t tid02;
pthread_attr_t attr;
if(argc != 2)
{
fprintf(stderr, "usage: a.out <integer value>\n");
return -1;
}
if(atoi(argv[1]) <= 0)
{
fprintf(stderr, "%d must be > 0\n", atoi(argv[1]));
return -1;
}
pthread_attr_init(&attr);
pthread_create(&tid01, &attr, runner01, argv[1]);
pthread_create(&tid02, &attr, runner02, argv[1]);
pthread_join(tid01, NULL);
pthread_join(tid02, NULL);
pthread_exit(0);
}
void * runner01(void * param)
{
int upper = atoi(param);
for (int i = 1; i <= upper; i++)
sum += i;
printf("[Thread 1] sum = %d\n", sum);
}
void * runner02(void * param)
{
int lower = atoi(param);
for (int i = 1; i <= lower; i++)
sum -= i;
printf("[Thread 2] sum = %d\n", sum);
}
#! /bin/bash
for ((i = 1; $i <= 1000; i++));
do
echo $i
./thread
done