0

我有一个程序,我在其中创建了两个线程。在一个线程中,我为整数ab. 在第二个线程中,我想访问aandb来更改它们的值。

#include <stdio.h>
#include <pthread.h>

struct data {
    int a;
    int b;
};

struct data temp;

void *assign(void *temp)
{
    struct data *new;

    new = (struct data *) temp;
    new->a = 2;
    new->b = 2;
    printf("You are now in thread1..\n The value of a and b is: %d, %d", new->a + 1, new->b + 1);
    printf("\n");
    pthread_exit(NULL);
}

void *add(void *temp1)
{
    struct data *new1;
    new1 = (struct data *) temp1;
    printf("You are now in thread 2\nValue of a and b is: %d, %d\n", new1->a - 1, new1->b - 1);
    pthread_exit(NULL);
}

int main()
{
    pthread_t threads[2];
    pthread_attr_t attr;
    void *status;
    int rc, t;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
    pthread_create(&threads[0], NULL, assign, (void *) &temp);
    pthread_create(&threads[1], NULL, add, (void *) &temp);
    pthread_attr_destroy(&attr);
    for (t = 0; t < 2; t++) {
        rc = pthread_join(threads[t], &status);
        if (rc) {
            printf("ERROR; return code from pthread_join() is %d\n", rc);
            exit(-1);
        }
        printf("Main: completed join with thread %ld having a status of %ld\n", t, (long) status);
    }
    pthread_exit(NULL);
    return 0;
}

但是上面的程序同时执行了两个线程。有时我得到

thread1..
The value of a and b is: 3, 3
thread 2
Value of a and b is: 1, 1

有时我得到

thread 2
Value of a and b is: -1, -1
You are now in thread1..
The value of a and b is: 3, 3

我想让 thread-2(add) 等待 thread-1(assign) 完成并退出。我该如何实施?

4

3 回答 3

10

如果一个线程必须等待另一个线程完成,我会看到三个选项:

  1. 使第二个线程pthread_join()在第一个线程上执行。
  2. 当第一个线程完成时,使用条件变量向第二个线程发出信号。
  3. 停止使用线程,因为拥有一个唯一的工作就是等待另一个线程是没有意义的。只需将逻辑顺序放在单个线程中即可。
于 2013-07-09T12:47:20.207 回答
0

我建议你使用信号量。

  1. 定义一个值为 1 的全局信号量。

  2. 在创建两个线程之前,你做一个 P 操作,信号量的值为 0。

  3. 在分配了 a 和 b 的值之后,在线程 1 中执行 V 操作。信号量的值为 1。

  4. 在线程 2 中,在执行打印之前,添加一个操作 V。如果线程 1 尚未完成分配,线程 2 将进入睡眠状态,直到线程 1 完成。

这就是我对这个问题的看法。

于 2013-07-09T13:55:24.917 回答
0

如果您使用多个线程,我的意思是您必须在每个其他线程上 pthread_join 两个以上的线程,这不是有效的解决方案。在我看来,您应该在进入和退出线程函数之后使用 pthrea_mutex_lock(&lock) 和 pthread_mutex_unlock(&lock) 。例如:

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void *assign(void *temp)
{
    pthread_mutex_lock(&lock)
    struct data *new;

    new = (struct data *) temp;
    new->a = 2;
    new->b = 2;
    printf("You are now in thread1..\n The value of a and b is: %d, %d", new->a + 1, new->b + 1);
    printf("\n");
    pthread_mutex_unlock(&lock)
    pthread_exit(NULL);
}

void *add(void *temp1)
{
    pthread_mutex_lock(&lock)
    struct data *new1;
    new1 = (struct data *) temp1;
    printf("You are now in thread 2\nValue of a and b is: %d, %d\n", new1->a - 1, new1->b - 1);
    pthread_mutex_unlock(&lock)
    pthread_exit(NULL);
}
于 2021-06-16T14:54:56.440 回答