使用带有线程的参数

时间:2018-03-27 02:45:03

标签: c multithreading pthreads

我使用linux pthreads库来尝试线程功能,下面的代码在屏幕上为每个线程打印5条消息,每个线程等待轮到显示使用信号量控制的消息,在Windows中它工作完美,但在Linux中线程不等待他们,我已经研究了所有唱歌,我无法解决这个问题。我的推论是我对参数struct

做错了
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>

typedef struct param{
  int id;
  pthread_mutex_t lock;
  sem_t semaforo;
}valores_t;

void * olamundo(void* args){
  valores_t* p = args;
  sem_wait(&p->semaforo);
  for (size_t i = 0; i < 5; i++) {
    printf("Hello from thread %d\n", p->id);
  }
  sem_post(&p->semaforo);
}

sem_t semaforo;

int main(int argc, char const *argv[]) {
  /* code */

  if(sem_init(&semaforo,0,1)){//valor inicial do semaforo começa por 1
    printf("Error\n");
  }

  valores_t p[2];
  pthread_t threads[2];

    p[0].id = 1;
    p[0].semaforo = semaforo;

    p[1].id = 2;
    p[1].semaforo = semaforo;

  for(int i = 0; i < 2; i++){
    if(pthread_create(&(threads[i]), NULL, &olamundo, &p[i]) == -1){
      printf("Error\n");
    }
  }

  for(int i = 0; i < 2; i++){
        if(pthread_join(threads[i], NULL)){
      printf("Error\n");
    }
    }
    sem_destroy (&semaforo);
  return 0;
}

1 个答案:

答案 0 :(得分:1)

我已经在ubuntu 14.04(gcc v4.8)上测试了你的代码,它按预期工作,所以我在猜它是编译器的一个问题。正如 james large 的评论所暗示的那样,您的编译器可能会在副本上创建信号量的新副本 - 您可以使用任何调试工具测试此理论,以验证信号量是否确实相同\不同对象

但更好的解决方案是将其作为指针传递,以确保它不依赖于编译器:

<script>window.$ = window.jQuery = require('jquery');</script>

测试并使用相同的编译器 - 我认为这是一个更安全的解决方案 希望这会有所帮助