Sử dụng trylock:Làm thế nào để sử dụng pthread_mutex_trylock?
FILE *fp;
pthread_mutex_t demoMutex;
void * printHello (void* threadId)
{
pthread_mutex_trylock (&demoMutex);
pthread_t writeToFile = pthread_self();
unsigned short iterate;
for (iterate = 0; iterate < 10000; iterate++)
{
fprintf (fp, " %d ", iterate, 4);
fprintf (fp, " %lu ", writeToFile, sizeof (pthread_t));
fprintf (fp, "\n", writeToFile, 1);
}
pthread_mutex_unlock (&demoMutex);
pthread_exit (NULL);
}
và sau đó main():
int main()
{
pthread_t arrayOfThreadId [5];
int returnValue;
unsigned int iterate;
fp = fopen ("xyz", "w");
pthread_mutex_init (&demoMutex, NULL);
for (iterate = 0; iterate < 5; iterate++)
{
if (returnValue = pthread_create (&arrayOfThreadId [iterate],
NULL,
printHello,
(void*) &arrayOfThreadId [iterate]) != 0)
{
printf ("\nerror: pthread_create failed with error number %d", returnValue);
}
}
for (iterate = 0; iterate < 5; iterate++)
pthread_join (arrayOfThreadId [iterate], NULL);
return 0;
}
Ở đây, đầu ra đầu tiên in một số trong những chủ đề đầu tiên và sau đó là phần còn lại, và sau đó một lần nữa là người đầu tiên. Khóa không hoạt động. Nếu tôi thay thế tương tự với pthread_mutex_lock
mọi thứ sẽ được hiển thị rất tuần tự!
Lỗi vô lý ở đây là gì?
Vì tò mò, bạn có thể cung cấp ví dụ trong đó '..._ lock()' được ưa thích hơn '..._ trylock()'? Ví dụ nếu bạn muốn thực hiện một thời gian chờ, sẽ không 'trylock' là sự lựa chọn? Hay nó không có ý nghĩa để làm một thời gian chờ? – theMayer
'..._ lock()' là tùy chọn thích hợp trong hầu hết các trường hợp vì trong hầu hết các trường hợp, luồng không thể thực hiện bất kỳ tiến trình nào hữu ích về phía trước mà không dùng mutex. Trong trường hợp này, nếu một '... trylock()' được sử dụng và không thể lấy khóa, lựa chọn duy nhất là lặp lại và cố gắng khóa nó lại. Thời gian chờ chỉ nên được yêu cầu trong trường hợp cần có sự kiện bên ngoài cho tiến trình tiến, có xu hướng ánh xạ tới biến điều kiện và do đó có thể sử dụng 'pthread_cond_timedwait()'. Một sự chờ đợi không bị chặn trên một mutex chỉ ra một vấn đề trong chính mã đó chứ không phải là một điều kiện đặc biệt. – caf
Đồng ý với câu cuối cùng ở đó ... Tôi có một số mã di sản mà nhà phát triển có chút tham vọng và có thể không hiểu cách hoạt động của luồng. Mã này cũng đang cố gắng ngủ luồng chỉ trong một mili giây một lần. Bạn phải cười, nếu không nó sẽ làm bạn khóc! – theMayer