Я нашел две проблемы.
Когда я пытался это сделать в Windows с MSys2, мой вывод был
The 1. thread got 101 points!
The 1. thread got 101 points!
The 2. thread got 0 points!
The 3. thread got 0 points!
The 5. thread got 0 points!
The 6. thread got 0 points!
The 6. thread got 0 points!
The 8. thread got 0 points!
The 9. thread got 0 points!
The 0. thread got 0 points!
Вы передаете адрес вашего счетчика циклов i
потокам. Эта переменная не является константой, поэтому потоки могут прочитать значение, которое уже изменилось. Чтобы исправить это, я создал массив int ids[10]
и передал каждому потоку свой собственный элемент массива идентификаторов.
Функция sleep
использует аргумент unsigned int
, поэтому вы эффективно вызываете sleep(0)
. С sleep(1)
программа работает медленнее, но работает как положено. Вы можете использовать usleep
, если вы хотите спать в течение доли секунды.
Измененная программа:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
pthread_mutex_t mutex;
int arr[10];
int sum = 0;
void *add (void* input){
int *id = (int*) input, x, s;
int ind = *id;
while (sum < 100){
while (1){
if (pthread_mutex_trylock(&mutex) != EBUSY)
break;
}
if (sum < 100){
x = rand() % 3;
arr[ind] = arr[ind] + x;
sum += x;
}
pthread_mutex_unlock(&mutex);
usleep(100000);
}
printf("The %d. thread got %d points!\n", ind, arr[ind]);
return NULL;
}
int main (void){
int i;
pthread_t threads[10];
int ids[10];
pthread_mutex_init(&mutex, NULL);
srand(time(NULL));
for (i = 0; i < 10; i++){
ids[i] = i;
if (pthread_create(&threads[i], NULL, add, &ids[i])){
perror("pthread_create");
exit(1);
}
}
for (i = 0; i < 10; i++){
if (pthread_join (threads[i], NULL)){
perror("pthread_join");
}
}
pthread_mutex_destroy(&mutex);
return 0;
}
В Adobe Developer Connection есть обходной путь:
Обходной путь для поддержки колеса мыши для FireFox с помощью wmode
Mousewheel не работает на меня ни один в AS3, когда я установил wmode=transparent. Кроме того, мое приложение флэш-памяти действует действительно странное и часто отказывает с wmode=transparent.
Плюс, это, кажется, не работает вообще над Firefox в соответствии с Linux... приложение флэш-памяти всегда выше всего.
Я не рекомендовал бы использовать wmode=transparent, если Ваше приложение не для очень определенного браузера, и Вы сделали обширное тестирование.