WaitForSingleObject и WaitForMultipleObjects, эквивалентный в Linux?

Существует ggiraph ( https://davidgohel.github.io/ggiraph/articles/offcran/using_ggiraph.html ), но так как я не знаю, что вы хотите показать, когда наведите курсор мыши, Я могу предоставить только неполную версию:

myChart <- ggplot(sales_data, aes(x = month, y = dept_name)) +
  geom_raster(data = expand.grid(sales_data$month, sales_data$dept_name),
              aes(x = Var1, y = Var2, width=1, height=1), fill = NA, col = 'gray50', lty = 1) + #default width and height is 1
  geom_point_interactive(aes(tooltip = status, data_id = status, colour = cut(revenue, c(-Inf, 199, 301, Inf)) ), 
             shape = 16, position = position_jitter(seed = 0), show.legend = F) +
  scale_color_manual(name = "revenue", 
                     values = c("(-Inf,199]" = "red",
                                "(199,301]" = "#ffbf00", #amber
                                "(301, Inf]" = "green") ) +
  geom_text(aes(label = revenue), size=4, vjust = 1.6, position = position_jitter(seed = 0)) + #try with geom_text

  theme_bw() +
  theme(
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    plot.background = element_blank(), 
    axis.line = element_blank(), 
    panel.border = element_blank(), 
    panel.grid = element_blank(),

    axis.text = element_text(colour = "blue", face = "plain", size =11)
  ) +

  scale_x_continuous(limits=c(0.5,3.5), expand = c(0,0), breaks = 1:length(month_vector), labels = month_vector) +

  scale_y_discrete(expand = c(0,0)) +

  geom_hline(yintercept = as.numeric(sales_data$dept_name) + 0.5) +
  geom_vline(xintercept = as.numeric(sales_data$month) - 0.5, color = "grey")
library(ggiraph)
ggiraph(myChart2)
girafe(code = print(myChart) )

27
задан jww 3 August 2019 в 17:55
поделиться

4 ответа

Придерживайтесь pthread_cond_timedwait и используйте clock_gettime. Например:

struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 10; // ten seconds
while (!some_condition && ret == 0)
    ret = pthread_cond_timedwait(&cond, &mutex, &ts);

Оберните его в функцию, если хотите.


ОБНОВЛЕНИЕ: дополняем ответ на основе наших комментариев.

В POSIX нет единого API для ожидания «всех типов» событий / объектов, как в Windows. У каждого свои функции. Самый простой способ уведомить поток о завершении - использовать атомарные переменные / операции. Например:

Основной поток:

// Declare it globally (argh!) or pass by argument when the thread is created
atomic_t must_terminate = ATOMIC_INIT(0);

// "Signal" termination by changing the initial value
atomic_inc(&must_terminate); 

Вторичный поток:

// While it holds the default value
while (atomic_read(&must_terminate) == 0) {
    // Keep it running...
}
// Do proper cleanup, if needed
// Call pthread_exit() providing the exit status

Другой альтернативой является отправка запроса на отмену с использованием pthread_cancel. Отменяемый поток должен был вызвать pthread_cleanup_push, чтобы зарегистрировать любой необходимый обработчик очистки. Эти обработчики вызываются в обратном порядке, в котором они были зарегистрированы. Никогда не вызывайте pthread_exit из обработчика очистки, потому что это неопределенное поведение. Статус выхода отмененной нити - PTHREAD_CANCELED. Если вы выберете эту альтернативу, я рекомендую вам прочитать в основном о точках отмены и типах.

И последнее, но не менее важное: вызов pthread_join сделает текущий поток блоком до тех пор, пока поток, переданный аргументом, не завершится. В качестве бонуса вы получите статус выхода потока.

12
ответ дан jweyrich 28 November 2019 в 05:46
поделиться

Что бы это ни стоило, мы (NeoSmart Technologies) только что выпустили библиотеку с открытым исходным кодом (лицензированную MIT) под названием pevents , которая реализует события ручного и автоматического сброса WIN32 в POSIX, и включает клоны WaitForSingleObject и WaitForMultipleObjects.

Хотя я лично советую вам использовать парадигмы многопоточности и сигнализации POSIX при кодировании на машинах POSIX, pevents дает вам другой выбор, если вам это нужно.

12
ответ дан Mahmoud Al-Qudsi 28 November 2019 в 05:46
поделиться

Я понимаю, что это старый вопрос сейчас, но для всех, кто сталкивается с ним, этот источник предполагает, что pthread_join () делает то же самое, что и WaitForSingleObject ():

http: / /www.ibm.com/developerworks/linux/library/l-ipc2lin1/index.html

Удачи!

1
ответ дан eskimo9 28 November 2019 в 05:46
поделиться

Для WaitForMultipleObjects с ложным WaitAll попробуйте это:

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

using namespace std;

pthread_cond_t condition;
pthread_mutex_t signalMutex;
pthread_mutex_t eventMutex;
int finishedTask = -1;

void* task(void *data)
{
    int num = *(int*)data;
    // Do some
    sleep(9-num);
    // Task finished
    pthread_mutex_lock(&eventMutex); // lock until the event will be processed by main thread
    pthread_mutex_lock(&signalMutex); // lock condition mutex
    finishedTask = num; // memorize task number
    pthread_cond_signal(&condition);
    pthread_mutex_unlock(&signalMutex); // unlock condtion mutex
}

int main(int argc, char *argv[])
{
    pthread_t thread[10];

    pthread_cond_init(&condition, NULL);
    pthread_mutex_init(&signalMutex, NULL); // First mutex locks signal
    pthread_mutex_init(&eventMutex, NULL); // Second mutex locks event processing

    int numbers[10];

    for (int i = 0; i < 10; i++) {
        numbers[i] = i;
        printf("created %d\n", i); // Creating 10 asynchronous tasks
        pthread_create(&thread[i], NULL, task, &numbers[i]);
    }

    for (int i = 0; i < 10;)
    {
        if (finishedTask >= 0) {
            printf("Task %d finished\n", finishedTask); // handle event
            finishedTask = -1; // reset event variable
            i++;
            pthread_mutex_unlock(&eventMutex); // unlock event mutex after handling
        } else {
            pthread_cond_wait(&condition, &signalMutex); // waiting for event
        }
    }

    return 0;
}
1
ответ дан Sorcerer 28 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

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