使用互斥锁同步订单中的线程

时间:2016-03-08 02:44:07

标签: c multithreading synchronization pthreads mutex

我有这个C程序,必须按0-6的顺序显示线程。我正在使用互斥锁,但是当我尝试运行我的代码时,没有任何反应,没有任何东西显示出来。此外,编译器显示没有错误

我使用了锁定和解锁互斥锁,但我不确定我是否在正确的位置创建了它。 任何建议和帮助表示赞赏。

#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 a_mutex = PTHREAD_MUTEX_INITIALIZER;


int main()
{
int i;
pthread_t tid[7];
// Initialize random number generator
time_t seconds;
time(&seconds);
srand((unsigned int) seconds);

int rc;



// Create our threads
for (i = 0; i < 7; i++)
{
    pthread_create(&tid[i], NULL, text, (void*)code[i]);

    for (i = 0; i < 7; i++)

    {  rc = pthread_mutex_lock(&a_mutex);

        for (i = 0; i < 7; i++)
        {
             rc = pthread_mutex_unlock(&a_mutex);
        }
    }

}
//join threads
for (i=0; i<7; i++)
{
    if (pthread_join(tid[i], NULL));
                }

rc = pthread_mutex_destroy(&a_mutex);

// Exit main
return 0;

}
void *text(void *arg)
{
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
printf("This is thread %d.\n", n);
// Exit thread
pthread_exit(0);
}

3 个答案:

答案 0 :(得分:1)

找出问题的关键是问自己问题&#34;我的6个帖子之间共享的数据是什么?&#34; 是需要在锁定的互斥锁块中进行互斥保护(读取和写入)的变量。目前,您只能从单个主线程锁定和解锁互斥锁,这实际上什么都不做。

你可能想要更接近这一点(虽然这可以大大简化 - 例如你可以完全删除睡眠):

#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 a_mutex = PTHREAD_MUTEX_INITIALIZER;

int main()
{
    int i;
    pthread_t tid[7];
    // 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]);

    //join threads
    for (i=0; i<7; i++)
        if (pthread_join(tid[i], NULL));

    pthread_mutex_destroy(&a_mutex);

    // Exit main
    return 0;
}

void *text(void *arg)
{   
    long n = (long)arg;
    long localNum = -1;
    int rand_sec = rand() % (3 - 1 + 1) + 1; // Random num seconds to     sleep
    int rc;
    while ( localNum != n )
    {
        rc = pthread_mutex_lock(&a_mutex);
        localNum = num;
        rc = pthread_mutex_unlock(&a_mutex);
        sleep(rand_sec); // Sleep for random amount of time
    }

    printf("This is thread %d.\n", n);

    rc = pthread_mutex_lock(&a_mutex);
    num++; // Let next thread go
    rc = pthread_mutex_unlock(&a_mutex);

    pthread_exit(0);
}

答案 1 :(得分:1)

这里是代码的最小版本,删除了等待和随机部分,因为它们将注意力转移到锁的工作方式。

线程自动排队等待互斥锁。

你需要在例程函数中询问锁。

始终记得关闭线程并释放所有可能代码路径上的锁。

#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 a_mutex = PTHREAD_MUTEX_INITIALIZER;


int main()
{
int i;
pthread_t tid[7];

// Create our threads
for (i = 0; i < 7; i++)
{
    pthread_create( &tid[i], NULL, text, (void*) & code[i] );
}



//join threads
for (i=0; i<7; i++)
{
    pthread_join(tid[i], NULL);
}

pthread_mutex_destroy( & a_mutex );

// Exit main
return 0;
}

void *text(void *arg)
{
while(1){
    pthread_mutex_lock(&a_mutex);
    if (num == *(int *) arg){
        printf("This is thread has the code %d\n",*(int *) arg);
        num++;
        pthread_mutex_unlock(&a_mutex);
        pthread_exit(0);
        }
    pthread_mutex_unlock(&a_mutex);
    }
}

答案 2 :(得分:0)

@Anastasia Netz。您只需要在代码的关键部分使用pthread_mutex_lock and pthread_mutex_unlock互斥锁,而不仅仅是在主线程中。请在您的代码中仔细识别您的关键部分(重要工作已完成并且对所有正在执行的线程都是通用的部分,但只有其中一个可以访问),并在那里使用这些互斥锁。 现在让我解释一下你的代码:      在您的代码中,您只需创建七个线程。在创建每个线程后,您只需锁定互斥锁一次并无故解锁七次。因此,在完成所有七次迭代(for创建这七个线程)之后,您已将锁定互斥锁七次并将其解锁(7 * 7 = 49)四十九次。 以下是执行此任务的代码:

for (i = 0; i < 7; i++) { pthread_create(&tid[i], NULL, text, (void*)code[i]);

 for (i = 0; i < 7; i++)
 {  
 rc = pthread_mutex_lock(&a_mutex);

    for (i = 0; i < 7; i++)
    {
         rc = pthread_mutex_unlock(&a_mutex);
    }
}}

请参阅Xvan的代码。