Могу ли я сигнализировать несколько потоков одновременно с помощью pthread_cond_wait (,)?

Вместо нижней строки

//header("Location:".ADMIN_URL."/index.php");

напишите

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

или

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

Это определенно решит вашу проблему. Я столкнулся с одной и той же проблемой, но решил решить эту проблему путем написания заголовка.

-1
задан Francesco Boi 17 January 2019 в 16:59
поделиться

3 ответа

Попробуйте опубликовать соответствующий код remove_from_buffer.

Еще лучше, Короткий, Автономный, Правильный Пример Создайте короткий main () с двумя потоками. Один поток добавляет в буфер через случайные интервалы. Другой поток удаляет из буфера через произвольные интервалы.

Пример

CELEBP22

/* CELEBP22 */                                   
#define _OPEN_THREADS                                                           
#include <pthread.h>                                                            
#include <stdio.h>                                                              
#include <time.h>                                                               
#include <unistd.h>                                                             

pthread_cond_t cond;                                                            
pthread_mutex_t mutex;                                                          

int footprint = 0;                                                              

void *thread(void *arg) {                                                       
  time_t T;                                                                     

  if (pthread_mutex_lock(&mutex) != 0) {                                        
    perror("pthread_mutex_lock() error");                                       
    exit(6);                                                                    
  }                                                                             
  time(&T);                                                                     
  printf("starting wait at %s", ctime(&T));                                     
  footprint++;                                                                  

  if (pthread_cond_wait(&cond, &mutex) != 0) {                                  
    perror("pthread_cond_timedwait() error");                                   
    exit(7);                                                                    
  }                                                                             
  time(&T);                                                                     
  printf("wait over at %s", ctime(&T));                                         
}                                                                               

main() {                                                                        
  pthread_t thid;                                                               
  time_t T;                                                                     
  struct timespec t;                                                            

  if (pthread_mutex_init(&mutex, NULL) != 0) {                                  
    perror("pthread_mutex_init() error");                                       
    exit(1);                                                                    
  }                                                                             

  if (pthread_cond_init(&cond, NULL) != 0) {                                    
    perror("pthread_cond_init() error");                                        
    exit(2);                                                                    
  }                                                                             

  if (pthread_create(&thid, NULL, thread, NULL) != 0) {                         
    perror("pthread_create() error");                                           
    exit(3);                                                                    
  }                                                                             

  while (footprint == 0)                                                        
    sleep(1);                                                                   

  puts("IPT is about ready to release the thread");                             
  sleep(2);                                                                     

  if (pthread_cond_signal(&cond) != 0) {                                        
    perror("pthread_cond_signal() error");                                      
    exit(4);                                                                    
  }                                                                             

  if (pthread_join(thid, NULL) != 0) {                                          
    perror("pthread_join() error");                                             
    exit(5);                                                                    
  }                                                                             
}       

ВЫХОД

запуск ожидание в пт 16 июня 10:54:06 2006 IPT готово к выпуску потока ожидание в пт 16 июня 10:54:09 2006

0
ответ дан Ерик снајпер 17 January 2019 в 16:59
поделиться

Альтернативное решение pthread_cond_broadcast() может быть следующим.

Вы определяете мьютекс для чтения и записи и блокируете его для записи в основном потоке перед созданием других потоков. Другие потоки попытаются получить блокировку чтения, но поскольку основной поток имеет блокировку записи, они будут заблокированы.

После создания всего потока основной поток снимает блокировку. Все остальные потоки будут активированы, и поскольку многие блокировки чтения могут сосуществовать, они будут выполняться одновременно (т.е. никто не будет заблокирован).

Код может быть что-то вроде:

pthread_rwlock_t lock; 

void handler(void *v) {
    if ((res = pthread_rwlock_rdlock(&lock)!=0)
    {
        exit(1);
    }
    printf("I am first! %d\n", v); 
    pthread_rwlock_unlock(&lock);
}


int main() {
    pthread_t t[threads];
    //First acquire the write lock:
    if ((res = pthread_rwlock_wrlock(&lock)!=0)
    {
        exit(1);
    }        
    for(int i =0; i < threads; i++)
    { 
        pthread_create(&t[i], NULL, handler, (void*) i); 
        //it is not clear if you want sleep inside the loop or not
        // You indented it as if to be inside but not put brackets
        sleep(2); 
    }
    pthread_rwlock_unlock(&lock); 
    for(int i =0; i < threads; i++) 
        pthread_join(t[i], NULL);
    pthread_rwlock_destroy(&lock);
    return 0; 
}
0
ответ дан Francesco Boi 17 January 2019 в 16:59
поделиться

использовать broadcast()?

http://pubs.opengroup.org/onlinepubs/009696699/functions/pthread_cond_broadcast.html

Функция pthread_cond_broadcast() должен разблокировать все потоки, заблокированные в данный момент в указанной условной переменной cond.

Функция pthread_cond_signal() должна разблокировать хотя бы один из потоков, которые заблокированы в указанной переменной условия cond (если какие-либо потоки заблокированы в cond).

0
ответ дан Francesco Boi 17 January 2019 в 16:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: