我是C和pthreads的新手。这是一个例子(可能不会像我现在写的那样编译),但它显示了我想知道的内容:
int i = 50;
void* myFunc (void* whatever) {
int myLoop = 0;
for (;;)
{
for (myLoop = 0; myLoop < i; myLoop++)
do work blah;
}
pthread_exit(NULL);
}
int main (void) {
pthread_t threadNo1, threadNo2, threadNo3;
pthread_create(&threadNo1, NULL, myFunc, NULL);
pthread_create(&threadNo2, NULL, myFunc, NULL);
pthread_create(&threadNo3, NULL, myFunc, NULL);
pthread_join(threadNo1, NULL);
pthread_join(threadNo2, NULL);
pthread_join(threadNo3, NULL);
pthread_exit(NULL);
}
3个线程之间是否共享int myLoop
?
myFunc
中的循环是否在所有3个线程上都正常运行(如正确迭代到50,这是int i
的值),或者由于{{myLoop++
,它们的值是否持续超过其值1}?这是因为变量int myLoop
在所有不同的线程中共享其内存值吗?
我希望myFunc在给予不同核心的不同线程上运行,而不会在循环时相互混乱,这意味着循环在所有线程上完美迭代,并且它们彼此无知。或者这实际上不是问题,而且确实是这样做的?
答案 0 :(得分:2)
3个线程之间是否共享了my myLoop?
线程与它无关。关于单个线程,可以询问同样的问题。考虑:
int myFunc(int *j)
{
int q;
// lots of code here
myFunc (&q);
}
考虑调用myFunc
然后调用myFunc
的单个线程。 myFunc
共享q
的两个实例是不是?答案是 - 两者都是。每次调用都有自己的q
。但是如果第二次调用*j = 2;
,它将改变第一次调用q
的值。
所以每个人都有自己的,但如果他们愿意,他们可以共享它们,因为它们具有相同的进程内存视图。
与线程相同。