#include <stdio.h>
#include <stdlib.h>
#include "common.h"
volatile int counter = 0;
int loops;
void *worker(void *arg)
{
int i;
for (i = 0; i < loops; i++)
{
counter++;
}
return NULL;
}
int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "usage: threads <value>\n");
exit(1);
}
loops = atoi(argv[1]);
pthread_t p1, p2;
printf("Initial value : %d\n", counter);
Pthread_create(&p1, NULL, worker, NULL);
Pthread_create(&p2, NULL, worker, NULL);
Pthread_join(p1, NULL);
Pthread_join(p2, NULL);
printf("Final value : %d\n", counter);
return 0;
}
主程序利用
Pthread_create()
创建了两个线程(
thread)。你可以将线程看作与其他函数在同一内存空间中运行的函数,甚且每一都有多个线程处于活动 状态。在这个例子中,每个线程开始在一个操为
worker()的函数中运行,在该函数中,它只 是递增一个计数器,循环
loops 一。
下面是运行这个程序、将变量
loops
的输入值设置为
1000
时的输出结果。
loops 的值决 定了两个
worker
各自在循环中增加共享计数器的一数。如果
loops
的值设置为 1000 甚运行 程序,你认为计数器的最终值是多少?
prompt> ./thread 100000
Initial value : 0
Final value : 143012 // huh??
prompt> ./thread 100000
Initial value : 0
Final value : 137298 // what the??
程序中的关键部分是增加共享计数器的地方,它需要
3 条指令:一条将计 数器的值从内存加载到寄存器,一条将其递增,另一条将其保存回内存。因为这
3 条指令 并不是以原子方式atomically)执行(所有的指令一次性执行)的,所以奇怪的事情可能会发生。