int g_ant = 0;
void *writeloop(void *arg)
{
while(g_ant < 10)
{
g_ant++;
usleep(rand()%10);
printf("%d\n", g_ant);
}
exit(0);
}
int main(void)
{
pthread_t time;
pthread_create(&time, NULL, writeloop, NULL);
writeloop(NULL);
pthread_join(time, NUL);
return 0;
}
嗨!我有四个问题,我相信在类别竞争条件下...? : - )
答案 0 :(得分:2)
g_ant++;
不是原子操作,可能导致未定义的行为。你应该使用pthread_mutex_lock(&mutex);
和
pthread_mutex_unlock(&mutex);
90%次从2开始的原因是因为线程time
进入函数,增加g_ant
并自行休眠。操作系统倾向于将它从CPU中取出并放在另一个没有睡眠的线程中,在你的情况下,这是你的主线程,再次将它增加1次运行睡眠。现在g_ant的值为2,线程time
恢复并打印2并将其递增为3.主线程恢复并打印3并再次递增它,这样就可以切换为什么你看到2中的数字 - &GT;大部分时间都是10个。希望它足够清楚并且应该回答2.问题。
pthread_join
确保其他线程在主线程退出程序之前完成其工作。
nope它不被视为第二个线程,它在主线程上运行该函数。
希望它有所帮助。
答案 1 :(得分:2)
- 主线程被认为是另一个线程。以下内容可能有助于您了解在添加互斥锁之前发生了什么(假设 你必须这样做下一步)。通常,您不会退出()整个过程 从一个线程 - 它永远不会在主线程中加入。
醇>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int g_ant = 0;
void *writeloop(void *arg)
{
while(g_ant < 10)
{
g_ant++;
usleep( rand() % 10 );
printf("thread: %u global: %d\n", (unsigned int)pthread_self(), g_ant);
}
return NULL;
}
int main(void)
{
pthread_t t;
pthread_create(&t, NULL, writeloop, NULL);
writeloop(NULL);
pthread_join(t, NULL);
printf("Joined\n");
return 0;
}