restrict says that the pointer is the only thing that accesses the underlying object.  It eliminates the potential for pointer aliasing, enabling better optimization by the compiler.
For instance, suppose I have a machine with specialized instructions that can multiply vectors of numbers in memory, and I have the following code:
void MultiplyArrays(int* dest, int* src1, int* src2, int n)
{
    for(int i = 0; i < n; i++)
    {
        dest[i] = src1[i]*src2[i];
    }
}
The compiler needs to properly handle if dest, src1, and src2 overlap, meaning it must do one multiplication at a time, from start to the end.  By having restrict, the compiler is free to optimize this code to using the vector instructions.
EDIT: Wikipedia has an entry on restrict, with another example, here.