【发布时间】:2017-09-02 19:36:31
【问题描述】:
我想在主线程中打印奇数,在新线程中打印偶数。我尝试编写一个程序,但它只打印奇数而不是偶数。我试图寻找线索以找出问题所在,但没有找到任何线索。
这是我的代码。
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#define MAX 1000
int count = 0;
void print_odd_numbers();
void *print_even_numbers();
int main() {
pthread_t t;
int iret;
iret = pthread_create(&t, NULL, print_even_numbers, NULL);
print_odd_numbers();
pthread_join(t, NULL);
return 0;
}
void print_odd_numbers() {
while(count <= MAX) {
if(count % 2 == 1) {
printf("%d\n", count);
}
count++;
}
}
void *print_even_numbers() {
while(count <= MAX) {
if(count % 2 == 0) {
printf("%d\n", count);
}
count++;
}
pthread_exit(NULL);
}
【问题讨论】:
-
每个线程都需要自己的 'count' 变量。不要使用全局变量!
-
@MartinJames 我见过许多程序,它们将计数保持在全局范围内。实际上这两个线程应该并行运行,所以它们引用的计数应该相同。据我所知。如果我错了,请帮忙。
-
@Priyanka Naik 不,这是不正确的。原因与 CPU 缓存一致性有关。除非您使用旨在以缓存一致方式原子地增加共享值的特定操作,否则您可以有两个 CPU(或内核),每个 CPU(或内核)都在缓存中迭代它们自己的变量副本,然后它们都将它们的副本写回一点。此外,编译器不必从内存中重新读取值,但这是另一回事。
-
@PriyankaNaik '我见过许多程序,它们将计数保持在全局范围内。' - 不幸的是,考虑到 umm.. 可能的“线程简介”网站/书籍的“不那么出色”的质量,我并不感到惊讶:(
-
@Martin James 哈哈!!
标签: c multithreading pthreads