Tuấ*_*hạm 1 c variables multithreading
我尝试编写一个包含2个线程的代码,它应该将2个数字xy递增到100,每次增量发生时,都应打印出来.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *inc_x(void *x_void_ptr){
int *x_ptr = (int *)x_void_ptr;
while (++(*x_ptr)<100) {
printf("x increment to %d \n",*x_ptr);
*x_ptr++;
}
return NULL;
}
void *inc_y(void *y_void_ptr){
int *y_ptr = (int *)y_void_ptr;
while (++(*y_ptr)<100) {
printf("y increment to %d \n",*y_ptr);
*y_ptr++;
}
return NULL;
}
int main()
{
int x = 0;
int y = 0;
printf("x: 0 , y : 0\n");
pthread_t inc_x_thread, inc_y_thread;
if (pthread_create(&inc_x_thread, NULL, inc_x, &x)) {
fprintf(stderr, "Error creating thread \n");
return 1;
}
if (pthread_create(&inc_y_thread, NULL, inc_y, &y)) {
fprintf(stderr, "Error creating thread \n");
return 2;
}
printf("%d , %d" , x,y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但我的x,y值没有增加.有人可以告诉我为什么吗?谢谢(顺便说一下,我是C的新手).
没有同步发生.特别是,你没有pthread_join()线程.
这意味着,在您尝试打印结果时,线程甚至都不会运行.他们可能已经跑了,但你无法确定.
另外,请参阅@mch上面的评论:你确实没有增加计数器,添加到前一个.所以即使线程确实运行,结果也不是你想要的.
为了正确操作,通常,您应该发出条件变量信号(并在消费线程上等待它)以确保结果准备就绪,或者在访问结果之前加入线程.发信号通知一个条件变量不那么重量级,所以这就是你想要重复的任务,而不是产生/加入数千个线程.
(在某些情况下,可以使用原子操作在线程之间成功共享数据,但这对于线程初学者来说太先进了.太容易让你的生活对此非常不满意,暂时保持cond vars.)
您通常还希望在程序退出时确保没有"遗忘"的线程仍在运行,这是另一个很好的理由,pthread_join即使您对同步不太感兴趣,也可以.
您可能倾向于认为这无关紧要,因为程序无论如何都会退出,有时甚至是这样.但总的来说,这种假设是无效的.你可能会很好地在写入文件或半文件中有垃圾,因为线程在操作中突然被杀死.
或者你可能有一个工作线程段错误,而操作系统突然拉开它仍然从它脚下访问的内存页面.哪个"看起来"完全正常,除非它没有.