我试着编写一个包含2个线程的代码,它应该将2个数字x y递增到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;
}
但是我的x,y值没有增加。有人可以告诉我为什么吗?谢谢(顺便说一下,我是C的新手)。
答案 0 :(得分:5)
没有同步发生。特别是,你没有pthread_join()
线程。
这意味着,在您尝试打印结果时,线程甚至都不会运行。他们可能已经跑了,但你无法确定。
另外,请参阅@mch上面的评论:你根本没有递增计数器,添加到上一个。所以即使线程确实运行,结果也不是你想要的。
为了正确操作,通常,您应该发出条件变量信号(并在消费线程上等待它)以确保结果准备就绪,或者在访问结果之前加入线程。发信号通知条件变量的重量级较小,因此您需要对重复的任务执行什么操作,而不是产生/加入数千个线程。
(在某些情况下,人们可以在线程之间使用原子操作成功共享数据,但这对于线程初学者来说太先进了。太容易让你的生活对此非常不满意,现在就保持cond vars。)
您通常也希望确保不会忘记&#34;程序退出时线程仍然在运行,这是调用pthread_join
的另一个好理由,即使你对同步不太感兴趣。
你可能倾向于认为它并不重要,因为程序无论如何都会退出,有时甚至是真的。但总的来说,这种假设是无效的。你可以,例如因为线程在操作过程中突然被杀死,所以很难将文件中的垃圾写入或写入半文件 或者你可能有一个工作线程段错误,而操作系统突然拉开它仍然从它脚下访问的内存页面。哪个&#34;看起来&#34;完全正常,除非它没有。
答案 1 :(得分:1)
在检查x和y的反射值之前在main中使用以下:
pthread_join(inc_x_thread, NULL);
pthread_join(inc_y_thread, NULL);
和
在递增时使用这两个函数:(* y_ptr)++;
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)++; // correction here
}
return NULL;
}