理解线程的小程序
2016-11-16 本文已影响60人
Nisen
一个简单的C语言实现的线程示例<a id="sec-1" name="sec-1"></a>
在看《Beginning Linux Programming》时,为了更好的理解线程的概念,书中列举了这样一个小例子:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
void *thread_function(void *arg);
char message[] = "Hello World";
int main() {
int res;
pthread_t a_thread;
void *thread_result;
res = pthread_create(&a_thread, NULL, thread_function, (void *)message);
if (res != 0) {
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
printf("Waiting for thread to finish...\n");
res = pthread_join(a_thread, &thread_result);
if (res != 0) {
perror("thread join failed");
exit(EXIT_FAILURE);
}
printf("Thread joined, it returned %s\n", (char *)thread_result);
printf("Message is now %s\n", message);
exit(EXIT_SUCCESS);
}
void *thread_function(void *arg) {
printf("thread_function is running, Argument was %s\n", (char *)arg);
sleep(3);
strcpy(message, "Bye!");
pthread_exit("Thank you for the CPU time");
}
将程序编译链接后运行,可以看到下面这样的结果
➜ chapter12 ./thread
Waiting for thread to finish...
thread_function is running, Argument was Hello World
Thread joined, it returned Thank you for the CPU time
Message is now Bye!
这里使用 pthread_create
创建新线程, pthread_create
的定义如下:
#include <pthread.h>
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
根据 pthread_create
要求, thread_function
只有一个指向void的指针作为参数,返回的也是指向void的指针。
当创建新的线程后,新线程在 thread_function
中开始执行,打印自己的参数。
原有线程在确保新线程启动后调用 pthread_join
函数等到线程结束,并且将新线程的返回值存在 thread_result
指针里。
新线程可以直接访问 message
数组变量,如果是调用 fork()
的话就没有这种效果。
python也提供了处理线程相关的 thread
和 基于它上面抽象的 threading
等模块,将在以后的文章中探究。
不由感慨,如果不多懂一些C语言,那么很难提高自己Python水平啊。