我使用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;
}
答案 0 :(得分:1)
我已经在ubuntu 14.04(gcc v4.8)上测试了你的代码,它按预期工作,所以我在猜它是编译器的一个问题。正如 james large 的评论所暗示的那样,您的编译器可能会在副本上创建信号量的新副本 - 您可以使用任何调试工具测试此理论,以验证信号量是否确实相同\不同对象
但更好的解决方案是将其作为指针传递,以确保它不依赖于编译器:
<script>window.$ = window.jQuery = require('jquery');</script>
测试并使用相同的编译器 - 我认为这是一个更安全的解决方案 希望这会有所帮助