Хорошо. Прежде всего, я рекомендую второй раз взглянуть на ваш стиль кодирования. Это, конечно, очень субъективно, и я не буду говорить, что ваш плохой, но мне потребовалось некоторое время, чтобы понять это (если вы действительно хотите знать, я рекомендую коддля кода C/C++).
Позволяет решить вашу проблему. Насколько я вижу, основная проблема заключается в том, что вы в основном сравниваете указатели на яблоки с указателями на бананы (другими словами, вы используете неправильный тип указателя в неправильном месте).
Чтобы убедиться в том, что вызовы функций и т.п. правильно, убедитесь, что для поиска документации по API для функций, которые являются новыми для вас (примеры: pthread_create, sem_init, sem_wait, sem_post, pthread_cond_signal).
Как вы можете видеть, pthread_cond_signal не принимает аргумент sem_t *, поэтому вы не можете передать его ему и ожидать, что он будет работать. Ниже вы найдете пример программы, показывающей, как семафоры используются.
Во-первых, создается новый поток, который мгновенно будет находиться в состоянии ожидания. Как только основной протектор закончил отсчет от 0 до 150, он отправит («разблокирует») семафор и разрешит второй поток завершить свое выполнение.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
static sem_t sem_thread_one;
static pthread_t thread_one_data;
static int x;
static void *tfunc(void *arg)
{
sem_wait(&sem_thread_one);
printf("Thread 1 is running. The value of x is %i\n", x);
return NULL;
}
int main(int argc, char **argv)
{
sem_init(&sem_thread_one, 0 /* don't share between processes */, 0);
if(pthread_create(&thread_one_data, NULL, &tfunc, NULL)) {
fprintf(stderr, "Could not create thread, exiting!\n");
return -EXIT_FAILURE;
}
while(x < 150) {
x++;
}
sem_post(&sem_thread_one);
if(pthread_join(thread_one_data, NULL)) {
fprintf(stderr, "Could not join threads, exiting!\n");
return -EXIT_FAILURE;
}
sem_destroy(&sem_thread_one);
printf("Program ran succesfully!\n");
return -EXIT_SUCCESS;
}
Сохранить в файле sem.c и компилировать & ссылку с помощью:
gcc -Wall -Os -pthread -o sem_test sem.c
Теперь второй пример, но теперь с помощью pthread_cond_t. Функциональность программы несколько схожа, она ждет, когда счетчик достигнет определенного числа.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
static pthread_t thread_one_data, thread_two_data;
static volatile int x, y, idx = 10;
static int count = 1;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t condition = PTHREAD_COND_INITIALIZER;
static void *cond_test_wait(void *arg)
{
pthread_mutex_lock(&mutex);
while(count < 10) {
printf("Waiting for `count < 10' to become true\n");
pthread_cond_wait(&condition, &mutex);
}
pthread_mutex_unlock(&mutex);
printf("Test wait thread finished. Value of count: %i\n", count);
return NULL;
}
static void *cond_test_signal(void *arg)
{
while(count < 10) {
pthread_mutex_lock(&mutex);
pthread_cond_signal(&condition);
/* do more intelligent things here */
count++;
pthread_mutex_unlock(&mutex);
}
printf("Test signal thread finished\n");
return NULL;
}
int main(int argc, char **argv)
{
if(pthread_create(&thread_one_data, NULL, &cond_test_wait, NULL)) {
fprintf(stderr, "Could not create thread, exiting!\n");
return -EXIT_FAILURE;
}
if(pthread_create(&thread_two_data, NULL, &cond_test_signal, NULL)) {
fprintf(stderr, "Could not create thread, exiting!\n");
return -EXIT_FAILURE;
}
pthread_join(thread_one_data, NULL);
pthread_join(thread_two_data, NULL);
pthread_cond_destroy(&condition);
pthread_mutex_destroy(&mutex);
printf("Program ran succesfully!\n");
return -EXIT_SUCCESS;
}
Сохранить в файле cond.c и компилировать & ссылку с помощью:
gcc -o cond -pthread -Os -Wall cond.c
Обратите внимание, насколько аккуратным условие работы в этом примере. Вы можете использовать их, чтобы ждать, пока какое-либо выражение (= условие) не станет истинным. После того, как условие станет истинным, нормальное выполнение продолжит.
Если вам нужна дополнительная помощь, не стесняйтесь спрашивать в комментариях. Удачи, сочетая приведенные выше примеры, чтобы исправить вашу программу.
Попробуйте: 'pthread_create (& tid [0], NULL, tfunc, (void *) таргеты [0]);' вместо того, что у вас есть. Кроме того, используйте 'sem_init (& sem [0], 0, 0);' вместо 'sem [0] = 0;'. Кроме того, 'sem_wait (sem)' будет блокироваться навсегда, поскольку вы никогда не отправляете сообщения на любые семафоры. – JS1
Как указано в JS1, в вашей концепции есть некоторые недостатки. Я рекомендую следующую книгу, чтобы прояснить ситуацию для вас http://www.linuxine.com/node/266773 (это бесплатно). – PEdroArthur
@ JS1 спасибо! Я буду продолжать пытаться :-) – Thomas