摘要:一个简单的语言实现的线程示例在看时,为了更好的理解线程的概念,书中列举了这样一个小例子将程序编译链接后运行,可以看到下面这样的结果这里使用创建新线程,的定义如下根据要求,只有一个指向的指针作为参数,返回的也是指向的指针。
一个简单的C语言实现的线程示例
在看《Beginning Linux Programming》时,为了更好的理解线程的概念,书中列举了这样一个小例子:
</>复制代码
#include
#include
#include
#include
#include
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...
");
res = pthread_join(a_thread, &thread_result);
if (res != 0) {
perror("thread join failed");
exit(EXIT_FAILURE);
}
printf("Thread joined, it returned %s
", (char *)thread_result);
printf("Message is now %s
", message);
exit(EXIT_SUCCESS);
}
void *thread_function(void *arg) {
printf("thread_function is running, Argument was %s
", (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
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水平啊。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/44263.html
摘要:诞生之处就支持多线程,所以自然有解决这些问题的办法,而且在编程语言领域处于领先地位。,线程规则这条是关于线程启动的。在语言里面,的语义本质上是一种可见性,意味着事件对事件来说是可见的,无论事件和事件是否发生在同一个线程里。 之前我们说了:1,可见性2,原子性3,有序性3个并发BUG的之源,这三个也是编程领域的共性问题。Java诞生之处就支持多线程,所以自然有解决这些问题的办法,而且在编...
摘要:基本线程的动作继续之前语言线程的文章文章文章来了解基本的线程操作。属性用完后对其进行清理回收通过共享的变量来检测子线程是否已经结束代码如下设置调度属性线程库提供以下调度策略先进先出调度。 基本线程的动作 继续之前C语言线程的文章:文章1 文章2 来了解基本的线程操作。 设置线程属性 设置脱离状态 下面代码中关键的地方在于: 通过 res = pthread_attr_init(...
摘要:基于的双重检查锁定的解决方案对于前面的基于双重检查锁定来实现延迟初始化的方案指示例代码,我们只需要做一点小的修改把声明为型,就可以实现线程安全的延迟初始化。 双重检查锁定的由来 在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下...
阅读 1542·2019-08-30 15:55
阅读 1765·2019-08-26 10:21
阅读 3530·2019-08-23 18:28
阅读 3451·2019-08-23 15:38
阅读 861·2019-08-23 15:24
阅读 2228·2019-08-23 13:59
阅读 843·2019-08-23 11:31
阅读 2929·2019-08-23 10:53
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要