64,682
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
static int a = 0;
static int n = 100;
pthread_barrier_t barrier;
void *
worker(void *arg)
{
int i;
printf("wait barrier... begin\n");
pthread_barrier_wait(&barrier);
printf("wait barrier... end\n");
for (i = 0; i < n; ++i)
++a;
}
int
main(int argc, char *argv[])
{
int i;
pthread_t tid[2];
if (argc == 2) {
n = atoi(argv[1]);
}
pthread_barrier_init(&barrier, NULL, 3);
pthread_create(&tid[0], NULL, worker, NULL);
pthread_create(&tid[1], NULL, worker, NULL);
sleep(1);
pthread_barrier_wait(&barrier);
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);
printf("a=%d\n", a);
return 0;
}
[/quote]
是100-200两个线程执行这个代码,分别叫线程1和线程2
1 mov eax,dword ptr [a]
2 add eax,1
3 mov dword ptr [a],eax
假如一开始线程1执行到第二条2指令就暂停了,然后线程2执行,线程2执行100次结束后在切换到线程1执行,此时线程1执行第3条指令那么a的地址就是1,因为eax是1。这时线程2再执行99次不就是100,然后两线程全部执行完成。
还有赵老师的教条在这边不适用了。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
static int a = 0;
static int n = 100;
pthread_barrier_t barrier;
void *
worker(void *arg)
{
int i;
printf("wait barrier... begin\n");
pthread_barrier_wait(&barrier);
printf("wait barrier... end\n");
for (i = 0; i < n; ++i)
++a;
}
int
main(int argc, char *argv[])
{
int i;
pthread_t tid[2];
if (argc == 2) {
n = atoi(argv[1]);
}
pthread_barrier_init(&barrier, NULL, 3);
pthread_create(&tid[0], NULL, worker, NULL);
pthread_create(&tid[1], NULL, worker, NULL);
sleep(1);
pthread_barrier_wait(&barrier);
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);
printf("a=%d\n", a);
return 0;
}