【发布时间】:2016-03-04 23:29:17
【问题描述】:
我正在尝试同步多个 (7) 线程。我以为我理解它们是如何工作的,直到我在我的代码上尝试它并且我的线程仍然乱序打印。代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>
void *text(void *arg);
long code[] = {4,6,3,1,5,0,2}; //Order in which to start threads
int num = 0;
pthread_mutex_t lock; //Mutex variable
int main()
{
int i;
pthread_t tid[7];
//Check if mutex worked
if (pthread_mutex_init(&lock, NULL) != 0){
printf("Mutex init failed\n");
return 1;
}
//Initialize random number generator
time_t seconds;
time(&seconds);
srand((unsigned int) seconds);
//Create our threads
for (i=0; i<7; i++)
pthread_create(&tid[i], NULL, text, (void*)code[i]);
//Wait for threads to finish
for (i=0; i<7; i++){
if(pthread_join(tid[i], NULL)){
printf("A thread failed to join\n");
}
}
//Destroy mutex
pthread_mutex_destroy(&lock);
//Exit main
return 0;
}
void *text (void *arg)
{
//pthread_mutex_lock(&lock); //lock
long n = (long) arg;
int rand_sec = rand() % (3 - 1 + 1) + 1; //Random num seconds to sleep
while (num != n) {} //Busy wait used to wait for our turn
num++; //Let next thread go
sleep(rand_sec); //Sleep for random amount of time
pthread_mutex_lock(&lock); //lock
printf("This is thread %d.\n", n);
pthread_mutex_unlock(&lock); //unlock
//Exit thread
pthread_exit(0);
}
所以我在这里尝试按顺序打印线程 0-6,但现在它们仍然处于乱码状态。注释掉的互斥锁是我最初拥有它的位置,但随后将其移至 print 语句上方的行,但我得到了类似的结果。我不确定我的互斥锁中的错误在哪里,有人可以给我一个提示或指出我正确的方向吗?对此,我真的非常感激。提前致谢!
【问题讨论】:
-
请解释为什么您认为您的线程应该“按顺序”打印?您所做的只是在 printf() 周围加了一个锁,无论如何它都有自己的内部锁。
-
@MartinJames 据我了解,锁会限制其他线程做任何事情,直到当前线程完成。
-
@donutjuice:那你理解的不对。 (成功)锁定互斥锁将阻止其他线程获取它,直到您释放它,仅此而已。与“直到当前线程完成”完全无关。而且由于您在尝试获取互斥锁之前让所有线程随机休眠一段时间,然后即使忽略您无法预测线程通常以何种顺序运行的事实,您也会竭尽全力尝试使它们不能按顺序运行。您对互斥锁所做的任何事情都不会阻止或试图阻止这种情况。
-
@PaulGriffiths 你能告诉我应该如何使用互斥锁吗?我尝试将锁放在函数的顶部(注释掉的 lock 语句),但是当我这样做时,没有打印任何线程。
-
@donutjuice:互斥锁用于同步对共享资源的访问,而不是用于同步线程的执行。您根本不应该将它们用于此目的。对
num的访问应该受到互斥锁的保护。您将线程的执行与条件变量同步。
标签: c multithreading pthreads mutex