0

启动分离线程后,线程会休眠一段时间。在睡眠时间结束时,更改了一个变量。但是变量只改变线程中的值。线程退出后,更改不再存在。

该代码在 Lam/MPI 7.4 下运行。如果这与普通 gcc 不同,现在不要这样做。

typedef struct theadSleep {
    struct task *task;
    int sleeptime;
    int result;
} ThreadSleep;

void sleepTask(void *dummy) {
    static volatile ThreadSleep *tS;
    tS = (ThreadSleep*) dummy;
    time_t t1;
    t1 = time(NULL );
    int t1int = (int) t1;
    t1int = t1int + tS->sleeptime;
    while (t1int >= (int) time(NULL )) {
        sleep(1);
    }
    tS->task->result = tS->result;
    pthread_exit(NULL );
}


// Function to start the thread
pthread_attr_t attrSleep; /* Attribut für Posix Thread */
pthread_t sleepT; /* Posix Thread */
static volatile ThreadSleep ts1;
ts1.result = 0;
ts1.sleeptime = 0;
ts1.result = resultRecieved[0];
ts1.sleeptime = resultRecieved[1];
ts1.task = tmpTask;
pthread_attr_init(&attrSleep);
pthread_attr_setdetachstate(&attrSleep, PTHREAD_CREATE_DETACHED);
if (pthread_create(&sleepT, &attrSleep, &sleepTask, (void*) &ts1)   == -1) {
  fprintf(stderr, "Fehler bei Starten des Sleep Threads Task %i Kind %i.\n",
  tmpTask->taskindex, tmpTask->taskkind);
}

        }

这里的声明tS->task->result = tS->result;没有效果!

示例,但没有错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <pthread.h>
#include <unistd.h>

typedef struct task {
        int result;
        int sleeptime;
} Task;

typedef struct theadSleep {
        struct task *task;
        int sleeptime;
        int result;
} ThreadSleep;


void sleepTask(void *dummy) {
    ThreadSleep *tS;
    tS = (ThreadSleep*) dummy;
    time_t t1;

    t1 = time(NULL );
    int t1int = (int) t1;
    t1int = t1int + tS->sleeptime;
    while (t1int >= (int) time(NULL )) {
        sleep(1);
    }
    tS->task->result = tS->result;
    printf("Detach Thread is ready.\n");
    pthread_exit(NULL );
}

int main (){
  Task *newtask = malloc(sizeof(Task));
  newtask->result = 0;
  newtask->sleeptime = 3;

  pthread_attr_t attrSleep; /* Attribut für Posix Thread */
  pthread_t sleepT; /* Posix Thread */
  ThreadSleep ts1;
  ts1.result = 14;
  ts1.sleeptime = newtask->sleeptime;
  ts1.task = newtask;

  pthread_attr_init(&attrSleep);
  pthread_attr_setdetachstate(&attrSleep, PTHREAD_CREATE_DETACHED);
  if (pthread_create(&sleepT, &attrSleep, &sleepTask, (void*) &ts1)
                                        == -1) {
    fprintf(stderr, "Fehler bei Starten des Sleep Threads.\n");
  }
  sleep (5);

  printf("Task result: %i \n",newtask->result);

return 0;
}
4

2 回答 2

1

“sleepTask”线程和主线程之间没有内存同步。

因此, sleepTask 线程可能会更新某些内存区域(如),但不能保证tS->task->result主线程看到此更新。(它最终会,但最终可能会在并发编程中很长一段时间。)

受互斥体保护的访问可以解决这个问题,就像让主线程加入工作线程然后检查有问题的内存一样。

于 2013-06-20T16:35:49.390 回答
0

您缺少memcpy(tS, dummy, sizeof(ThreadSleep));
此外,如果您只想在本地进行更改,则删除tS = (ThreadSleep*) dummy;
适用。否则,忘记 memcpy 和 malloc。在这种情况下,只需将“虚拟”转换为 ThreadSleep*。但是,如果你离开它并且如果你想避免内存泄漏,也可以添加free();.

于 2013-06-19T19:12:32.457 回答