时间:2021年7月18日15:23:54
rand函数
C语言中用来产生一个随机数的函数。
但是rand函数产生的是伪随机数,每次调用的是同一组随机数。
rand()函数
#include <stdlib.h>
int rand(void);
randDemo
#include <stdio.h>
#include <stdlib.h>
int arr[100];
int main()
{
printf("[0,49]\n");
int i;
for (i = 0; i < sizeof(arr) / sizeof(int); i++)
{
arr[i] = rand() % 50; //0 - 49
//arr[i] = rand() % 50 + 1;//1 - 50
}
for (i = 0; i < sizeof(arr) / sizeof(int); i++)
{
printf("arr[%d] = %d\n", i, arr[i]);
}
printf("\n\n\n");
printf("[1,100]\n");
for (i = 0; i < sizeof(arr) / sizeof(int); i++)
{
// arr[i] = rand() % 100; //0 - 99
arr[i] = rand() % 100 + 1;//1 - 100
}
for (i = 0; i < sizeof(arr) / sizeof(int); i++)
{
printf("arr[%d] = %d\n", i, arr[i]);
}
return 0;
}
运行结果:(结果不唯一)
example3.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
//同一个进程(程序)的多个线程共享全局变量
int arr[5000];
int s1, s2;
void *myFunc1(void *arg)
{
for (int i = 0; i < 2500; i++)
{
s1 += arr[i];
}
return NULL;
}
void *myFunc2(void *arg)
{
for (int i = 2500; i < 5000; i++)
{
s2 += arr[i];
}
return NULL;
}
int main()
{
//arr赋初值
for (int i = 0; i < 5000; i++)
{
arr[i] = rand() % 50 + 1; //区间[1,50]
}
// for (int i = 0; i < 5000; i++)
// {
// printf("arr[%d] = %d\n", i, arr[i]);
// }
//声明两个线程
pthread_t th1;
pthread_t th2;
//创建两个线程
pthread_create(&th1, NULL, myFunc1, NULL);
pthread_create(&th2, NULL, myFunc2, NULL);
//等待线程执行完毕
pthread_join(th1, NULL);
pthread_join(th2, NULL);
printf("s1 = %d\n", s1);
printf("s2 = %d\n", s2);
printf("s1 + s2 = %d\n", s1 + s2);
return 0;
}
运行结果不唯一.
s1 = 63903
s2 = 64232
s1 + s2 = 128135
example3s.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
//线程参数结构体
typedef struct
{
int first;
int last;
int result;
} MY_ARGS;
int arr[5000];
void *myFunc(void *args)
{
int s;
MY_ARGS *my_args = (MY_ARGS *)args;
int first = my_args->first;
int last = my_args->last;
for (int i = first; i < last; i++)
{
s += arr[i];
}
my_args->result = s;
return NULL;
}
int main()
{
//arr赋初值
for (int i = 0; i < 5000; i++)
{
arr[i] = rand() % 50 + 1; //区间[1,50]
}
//声明两个线程
pthread_t th1;
pthread_t th2;
//定义两个参数
MY_ARGS arg1 = {0, 2500, 0};
MY_ARGS arg2 = {2500, 5000, 0};
//创建两个线程
pthread_create(&th1, NULL, myFunc, &arg1);
pthread_create(&th2, NULL, myFunc, &arg2);
//等待线程执行完毕
pthread_join(th1, NULL);
pthread_join(th2, NULL);
int s1 = arg1.result;
int s2 = arg2.result;
printf("s1 = %d\n", s1);
printf("s2 = %d\n", s2);
printf("s1 + s2 = %d\n", s1 + s2);
return 0;
}
运行结果不唯一.
s1 = 63903
s2 = 64232
s1 + s2 = 128135
example3.c中有提到同一个进程(程序)的多个线程共享全局变量.那么为什么不用一个变量把所有数据都加起来?
在这个例子里是可以的.最起码结果上是一样的.如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
//线程参数结构体
typedef struct
{
int first;
int last;
} MY_ARGS;
int arr[5000];
int s;
void *myFunc(void *args)
{
MY_ARGS *my_args = (MY_ARGS *)args;
int first = my_args->first;
int last = my_args->last;
for (int i = first; i < last; i++)
{
s += arr[i];
}
return NULL;
}
int main()
{
//arr赋初值
for (int i = 0; i < 5000; i++)
{
arr[i] = rand() % 50 + 1; //区间[1,50]
}
//声明两个线程
pthread_t th1;
pthread_t th2;
//定义两个参数
MY_ARGS arg1 = {0, 2500};
MY_ARGS arg2 = {2500, 5000};
//创建两个线程
pthread_create(&th1, NULL, myFunc, &arg1);
pthread_create(&th2, NULL, myFunc, &arg2);
//等待线程执行完毕
pthread_join(th1, NULL);
pthread_join(th2, NULL);
printf("s1 = %d\n", s);
return 0;
}
运行结果:
s = 128135
我这里用一个变量s把arr数组的全部数据加起来了,结果却证明这样是可以的.这就涉及到另一个问题了.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
//同一个进程(程序)的多个线程共享全局变量
int s;
void *myFunc(void *args)
{
//i的最大值是10000的时候,最后结果都是 s=20000;
//但是i=10 0000时就s就开始小于20 0000了,并且结果不确定.此时出现了Race Condition问题
for (int i = 1; i <= 100000; i++)
{
s++;
}
return NULL;
}
int main()
{
//声明两个线程
pthread_t th1;
pthread_t th2;
//创建两个线程
pthread_create(&th1, NULL, myFunc, NULL);
pthread_create(&th2, NULL, myFunc, NULL);
//等待线程执行完毕
pthread_join(th1, NULL);
pthread_join(th2, NULL);
printf("s = %d\n", s);
return 0;
}
Race Condition 资源竞争
s++;
这一语句,可分成三个部分:
- read(s);读取s的值
- s=s+1;改变s的值
- write(s);写入s的值
若线程一刚执行完1 , 2步的时候,线程二开始执行,这时候线程一二读取的数值是一样的,执行的结果自然也是一样的.以上就是出错的原因.