目录
2023-11-27操作系统_进程—线程_实验
5-10:
代码:
运行结果:
5-11
代码:
运行结果:编辑
2023-11-27操作系统实验
5-10:
代码:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
char message[50]="Hello World ";
void * thread_function(void *arg){
int k;
printf("= = = Tread_function1 is running.Argument was %s \n",(char *)arg);
for(k=0;k<10;k++){
sleep(rand()%3);
strcpy(message,"ANOTHER THREAD!");
pthread_exit(" = = = Thank you for your CPU time!");
sleep(rand()%3);
strcpy(message,"THREAD!");
}
pthread_exit("= = = Thank you for your CPU time!");
}
void *thread_function2(void*arg){
int k;
printf("= = = Tread_function2 is running.Argument was %s \n",(char *)arg);
for(k=0;k<10;k++){
sleep(rand()%3);
strcpy(message,"ANOTHER THREAD!");
}
pthread_exit("= = = Thank you for your CPU time!");
}
int main(){
int res,k;
pthread_t thread1;
pthread_t thread2;
void* thread_result;
res=pthread_create(&thread1,NULL,thread_function,(void*)message);
res=pthread_create(&thread2,NULL,thread_function2,(void*)message);
for(k=0;k<20;k++){
sleep(1);
printf("Message is now %s \n",message);
}
exit(EXIT_FAILURE);
}
首先,包含了一些头文件,这些头文件提供了一些函数和数据类型的声明,以便在代码中使用。
接下来,定义了一个全局变量 `message`,它是一个字符数组,长度为50,用于存储消息。
然后,定义了两个线程函数 `thread_function()` 和 `thread_function2()`。这些函数将作为线程的入口点,在被创建的线程中执行。
在 `main()` 函数中,声明了一些变量,包括线程标识符、线程返回值等。然后,调用 `pthread_create()` 函数来创建两个线程 thread1 和 thread2,同时传递线程函数指针和参数。
接下来是一个 for 循环,循环20次。在每次循环中,主线程会休眠1秒钟,并输出全局变量 `message` 的值。
现在让我们来看看线程函数 `thread_function()`。首先,它打印一条消息,然后进入一个 for 循环,循环10次。在每次循环中,线程会休眠随机时间(0到2秒之间),然后将字符串 "ANOTHER THREAD!" 复制到全局变量 `message` 中。接着,线程会调用 `pthread_exit()` 函数,退出线程,并返回一个退出消息。
线程函数 `thread_function2()` 与 `thread_function()` 类似。它也打印一条消息,然后进入一个 for 循环,循环10次。在每次循环中,线程会休眠随机时间,并将字符串 "ANOTHER THREAD!" 复制到全局变量 `message` 中。最后,线程调用 `pthread_exit()` 函数,退出线程,并返回一个退出消息。
当主线程执行完循环后,调用 `exit()` 函数来退出程序。
总结来说,这段代码展示了如何创建和运行多个线程,并且演示了线程之间共享数据的概念。两个线程会修改全局变量 `message` 的值,并且通过休眠和复制操作展示线程的并发执行。主线程则在循环中输出全局变量的值,以观察线程对该值的修改。
运行结果:
5-11
代码:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
char message[50]="Hello World";
void *thread_function(void*arg)
{
printf("= = = CHild run and want to sleep(5).message Now is %s \n",(char*)arg);
sleep(5);
strcpy(message,"HELLO FATHER!");
pthread_exit("= = = Thank you for your CPU time !");
}
int main(){
int res;
pthread_t threadCH;
void *thread_result;
res=pthread_create(&threadCH,NULL,thread_function,(void*)message);
if(res!=0){
perror("Thread creation failed!");
exit(EXIT_FAILURE);
}
printf("MAIN THREAD is Waiting for thread to finish by JOIN....\n");
res=pthread_join(threadCH,&thread_result);
if(res!=0){
perror("Thread join failed!\n");
exit(EXIT_FAILURE);
}
printf("CHILD THREAD returned %s \n",(char*)thread_result);
printf("Message NOW is %s \n",message);
exit(EXIT_FAILURE);
}
这段代码使用了 POSIX 线程库来创建一个线程,并在主线程中等待子线程执行完毕后再退出程序。下面是具体的解释:
首先,头文件包含了一些必要的库,比如 `unistd.h`、`stdio.h`、`stdlib.h`、`string.h` 和 `pthread.h`。
然后,定义了一个字符数组 `message`,并初始化为 "Hello World"。
接着,定义了一个线程函数 `thread_function()`,它的作用是将全局变量 `message` 的值修改为 "HELLO FATHER!",并在子线程中调用 `pthread_exit()` 函数以退出线程。
在 `main()` 函数中,声明了一些变量,包括线程标识符、线程返回值等。
接下来,调用 `pthread_create()` 函数来创建一个子线程 `threadCH`,同时传递线程函数指针和参数。在这里,我们传递了全局变量 `message` 的地址作为参数。
如果 `pthread_create()` 函数返回值不为 0,则表示线程创建失败,此时输出错误信息并通过 `exit()` 函数退出程序。
在成功创建子线程后,主线程输出一条消息,表示正在等待子线程执行完毕。
接着,调用 `pthread_join()` 函数来等待子线程结束,并获取其返回值。如果 `pthread_join()` 函数返回值不为 0,则表示等待子线程失败,此时输出错误信息并通过 `exit()` 函数退出程序。
最后,主线程输出子线程的返回值和全局变量 `message` 的值,并通过 `exit()` 函数结束程序。
总体来说,这段代码演示了如何使用 POSIX 线程库来创建和控制线程,以及如何在线程中共享全局变量。在子线程中,我们将全局变量 `message` 的值修改为 "HELLO FATHER!",并在主线程中等待子线程执行完毕后输出其返回值和最终的 `message` 值。